Перейти к содержанию

Aleks133

Пользователи
  • Активность

    30
  • Зарегистрирован

  • Посещение

Информация о Aleks133

  • Звание
    Продвинутый пользователь

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. 10.1 upd2 Berlin Указанный способ не сработал. Вышел из положения так: procedure TForm1.Edit6Click(Sender: TObject); var selcol, selst: Integer; begin selst := Edit6.SelStart; //запонинаем куда кликнули курсором if Edit6.Text <> '' then begin Edit6.SelectAll; //выделяем всю строку selcol := Edit6.SelLength;//узнаем сколько символов в строке Edit6.SelStart := selcol - 1; //ставим курсор в любое место чтобы снять выделение и в помощьнике клавиатуры появились подсказки Edit6.SelStart := selst; //и возвращаем каретку на место куда изначально было кликнуто end; end; Только есть минус:по удержанию пальца текст не получиться выделить.
  2. Для stringgrid разобрался procedure TForm1.StringGrid1EditingDone(Sender: TObject; const ACol, ARow: Integer); begin StringGrid1.Cells[1, ARow] := StringGrid1.Cells[ACol, ARow]; end; а вот для грида не работает(( procedure TForm1.Grid1EditingDone(Sender: TObject; const ACol, ARow: Integer); begin Grid1.Columns[1].Controls.items[ARow].data := Grid1.Columns[ACol] .Controls.items[ARow].data; end;
  3. В общем весь день убил на поиски, так ничего и не нашел.Нашел все что хотел,но только все старое что уже не работает. 1.Как обращаться к ячейке, для чтения и записи?не через Grid1GetValue а с кнопки например так : procedure TForm1.Button4Click(Sender: TObject); val: TValue; str: string; begin val := Grid1.Columns[1].Controls.items[1].Data; //не работает так showmessage(val.tostring); end; 2. Как ячейке в столбце TProgressColumn присвоить значение(тоже с кнопки)? Пока все что у меня получилось сделать (по справке) это: private a, b, c: array of TValue; { Private declarations } public constructor Create(AOwner: TComponent); override; { Public declarations } end; const kat: array [0 .. 5] of string = ('Доходы', 'Расходы', 'Магазин', 'Продукты', 'Работа', 'Заправка'); sym_kat: array [0 .. 5] of Integer = (1000, 2000, 2500, 355, 1500, 1700); var Form1: TForm1; implementation constructor TForm1.Create(AOwner: TComponent); begin inherited; SetLength(a, Grid1.RowCount); SetLength(b, Grid1.RowCount); SetLength(c, Grid1.RowCount); end; procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); var i: Integer; begin if ACol = 0 then Value := a[ARow]; if ACol = 1 then Value := b[ARow]; if ACol = 2 then Value := c[ARow]; end; procedure TForm1.Grid1SetValue(Sender: TObject; const ACol, ARow: Integer; const Value: TValue); var i: Integer; begin if ACol = 0 then a[ARow] := Value; if ACol = 1 then b[ARow] := Value; if ACol = 2 then c[ARow] := Value; end; //так заполняю данными procedure TForm1.Button3Click(Sender: TObject); var i: Integer; begin for i := 0 to Grid1.RowCount - 1 do begin a[i] := kat[i]; c[i] := sym_kat[i]; b[i] := sym_kat[i]; StringColumn3.UpdateCell(i); ProgressColumn2.UpdateCell(i); StringColumn4.UpdateCell(i); end; end; //так получу значение из третьего столбца третьей строки procedure TForm1.Button2Click(Sender: TObject); begin showmessage(c[2].ToString); //2500 end; Но при редактировании суммы, прогресс не меняется.Как это сделать, для меня пока загадка. Буду признателен за любую помощь. P.s.Не обязательно TGrid, можно и TStringGrid
  4. Я в шоке, нашел))Как все было просто.а вот как в stringgrid? И как сделать чтобы значение value бралось из другой колонки тойже сточки? procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); begin if aCol = 1 then Value := 50; end;
  5. Aleks133

    TProgressColumn на сетке

    Вечер добрый, Сдаюсь,уже устал искать . Подскажите,кто знает, ну вот как они создали прогресс в TGrid и TStringGrid на демке? Спасибо.
  6. Сам не знаю как, но получилось)))пол дня читал форумы чтобы хоть что-то понять из этого. И методом "научного тыка" вот: uses androidapi.helpers, Androidapi.JNI.app,FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText; var FMessageSubscriptionID:integer; procedure tform1.Scan1; var intent: JIntent; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage); intent := TJIntent.Create; intent.setAction(StringToJString('com.google.zxing.client.android.SCAN')); SharedActivity.startActivityForResult(intent, 0); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M:TMessage); var RequestCode, ResultCode: Integer; Intent: JIntent; s:string; begin if not(M is TMessageResultNotification) then exit; TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; RequestCode:=TMessageResultNotification(M).RequestCode; ResultCode:=TMessageResultNotification(M).ResultCode; Intent:=TMessageResultNotification(M).Value; if ResultCode = TJActivity.JavaClass.RESULT_OK then begin if Assigned(Intent) then begin s:=JStringToString(intent.getStringExtra(StringToJString('SCAN_RESULT'))); //получил результат со сканера convert(s); //использовал результат со сканера в своей процедуре end; end else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then begin //Memo1.Lines.Append('RESULT_CANCELED'); end; end; procedure TForm1.Button2Click(Sender: TObject); begin scan1; //запуск сканеровки; end; Не знаю правильно ли это все будет работать, но во всяком случае приложение не виснит(пока) и что хотел получил. Slym'у большое спасибо за наводку. Если кто знает что нужно добавить\исправить для гарантированно стабильной(без сюрпризов в дальнейшем) работы кода, буду благодарен.
  7. Спасибо за ответ.Вот только знать бы как это все работает и где это применить((Буду изучать...еще раз спасибо.
  8. Добрый вечер. Пытаюсь добавить сканеровку qr кода в приложение.Делаю так: uses FMX.ALDevBarcode; private FBarcode: TALDevBarcode; procedure BarcodeScanResult(Sender: TObject; AResult: string); procedure convert(s: string); procedure TForm1.BarcodeScanResult(Sender: TObject; AResult: string); var ScanThread: TScanthread; begin convert(AResult); end; procedure TForm1.convert(s: string); var d, t, sum_start, fn_start, i_start: integer; dt, tm: TDateTime; sdt, tdt, summa, fn, fn_find_str: string; fn_find, fn_name_find: variant; begin if ContainsText(s, 't=') and ContainsText(s, 'T') and ContainsText(s, '&s=') and ContainsText(s, '&fn=') then begin sum_start := pos('&s=', s, 1); // начало суммы fn_start := pos('&fn=', s, 1); // начало фн номера i_start := pos('&i=', s, 1); // начало i номера fn := copy(s, fn_start + 4, i_start - (fn_start + 4));//ФН номер summa := copy(s, sum_start + 3, fn_start - (sum_start + 3)); // сумма summa := stringreplace(summa, '.', ',', [rfReplaceAll]); sdt := copy(s, pos('t=', s, 1) + 2, 8); // вся дата tdt := copy(s, pos('T', s, 1) + 1, 4); // все время dt := EncodeDate(strtoint(copy(sdt, 1, 4)), strtoint(copy(sdt, 5, 2)), strtoint(copy(sdt, 7, 2))); // цифры переводим в дату tm := encodetime(strtoint(copy(tdt, 1, 2)), strtoint(copy(tdt, 3, 2)), 0, 0); // цифры переводим в время DateEdit1.DateTime := dt + tm; Label1.Text := summa; Button2.Hint := fn; // кнопке сканера присаиваем результат фн dm.magaz.Open('select * from magaz'); //список магазинов fn_find := dm.magaz.Lookup('fn', fn, 'name'); //ищем имя магазина в бд fn_name_find := dm.magaz.Lookup('fn', fn, 'fn'); //ищем фн в бд if vartype(fn_name_find) = varnull then begin Label40.Text := 'Не известный магазин'; // Не известный магазин Label40.tag := 0; // такого фн нет в БД end else if (vartype(fn_find) = varnull) or (fn_find = '') then begin Label40.Text := 'Не известный магазин'; // Не известный магазин Label40.tag := 2; // у этого ФН нет названияв в БД end else begin Label40.Text := fn_find; // название найденного по фн магазина Label40.tag := 1; // название магазина есть в БД end; if Label40.tag <> 4 then Label40.HitTest := True; end else showmessage('QR код не содержит нужных данных'); end; procedure TForm1.Button2Click(Sender: TObject); begin FBarcode.Scan; end; Содержимое FMX.ALDevBarcode unit FMX.ALDevBarcode; interface uses FMX.Types, FMX.Platform, System.Classes, System.Rtti, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; type TALDevBarcodeScanEvent = procedure (Sender: TObject; AResult: string) of object; TALDevBarcode = class(TFmxObject) private FPreservedClipboardValue: TValue; FMonitorClipboard: Boolean; FClipService: IFMXClipboardService; FOnScanResult: TALDevBarcodeScanEvent; function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure DoScanResult(AValue: string); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Scan; property OnScanResult: TALDevBarcodeScanEvent read FOnScanResult write FOnScanResult; end; implementation { TALDevBarcode } constructor TALDevBarcode.Create(AOwner: TComponent); var aFMXApplicationEventService: IFMXApplicationEventService; begin inherited Create(AOwner); FMonitorClipboard := False; if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(FClipService)) then FClipService := nil; if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent) else Log.d('Application Event Service is not supported.'); end; destructor TALDevBarcode.Destroy; begin inherited Destroy; end; procedure TALDevBarcode.DoScanResult(AValue: string); begin if Assigned(FOnScanResult) then FOnScanResult(Self, AValue); end; function TALDevBarcode.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; function GetBarcodeValue: Boolean; var value: String; begin Result := False; FMonitorClipboard := False; if (FClipService.GetClipboard.ToString <> 'nil') then begin DoScanResult(FClipService.GetClipboard.ToString); FClipService.SetClipboard(FPreservedClipboardValue); Result := True; end; end; begin Result := False; if FMonitorClipboard and (AAppEvent = TApplicationEvent.BecameActive) then Result := GetBarcodeValue; end; procedure TALDevBarcode.Scan; var intent: JIntent; begin if Assigned(FClipService) then begin FPreservedClipboardValue := FClipService.GetClipboard; FMonitorClipboard := True; FClipService.SetClipboard('nil'); intent := TJIntent.Create; intent.setAction(StringToJString('com.google.zxing.client.android.SCAN')); //intent.putExtras(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('"SCAN_MODE", "CODE_39"')); SharedActivity.startActivityForResult(intent, 0); end; end; end. После нажатия на button2 открывается сканер, сканирую и приложение зависает(в оснавном когда сканирую первый раз).
  9. Здравствуйте, экспериментирую с загрузкой своих иконок в imagelist на основе примеров с форума. Мои действия: 1. Загружаю картинку в TImage 2.делаю ее круглой procedure TForm1.Button11Click(Sender: TObject); var b: TBitmap; begin b := TBitmap.Create(); b.SetSize(512, 512); b.canvas.BeginScene(); try b.canvas.Fill.Bitmap.Bitmap := Image1.Bitmap; b.canvas.Fill.Kind := TBrushKind.Bitmap; b.canvas.Fill.Bitmap.wrapmode := twrapmode.TileStretch; b.canvas.FillEllipse(rectf(0, 0, 512, 512), 1); finally b.canvas.EndScene; b.Free; end; Image1.Bitmap.Assign(b); end; 3.загружаю ее в imagelist function TImageListHelper.Add(aBitmap: TBitmap): integer; const Scale = 1; var vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; vLayer: TLayer; begin Result := -1; if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit; // add source bitmap vSource := Source.Add; vSource.MultiresBitmap.TransparentColor := TColorRec.Fuchsia; vSource.MultiresBitmap.SizeKind := TSizeKind.Source; vSource.MultiresBitmap.Width := Round(aBitmap.Width / Scale); vSource.MultiresBitmap.Height := Round(aBitmap.Height / Scale); vBitmapItem := vSource.MultiresBitmap.ItemByScale(Scale, True, True); if vBitmapItem = nil then begin vBitmapItem := vSource.MultiresBitmap.Add; vBitmapItem.Scale := Scale; end; vBitmapItem.Bitmap.Assign(aBitmap); vDest := Destination.Add; vLayer := vDest.Layers.Add; vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiresBitmap.Width, vSource.MultiresBitmap.Height); vLayer.name := vSource.name; Result := vDest.Index; end; procedure TForm1.Button9Click(Sender: TObject); begin ImageList1.Add(Image1.Bitmap) end; 4. теперь хочу загрузить фото с камеры procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap); begin //ImageList1.Add(Image); //способ 1 сразу в ImageList Image1.Bitmap.Assign(Image); //способ 2 сначала в TImage потом в ImageList end; Иконка с камеры добавляется нормально(становится картинка+Item 4), как обычная(квадратная) так и обрезанная(круглая). Но как только она добавляется , то все иконки которые были обрезаны по кругу пропадают, а имена остаются. Не пойму что я делаю не так? P.S. если ничего не обрезать, то все работает как надо.
  10. Спасибо за совет!Возможно когда-нибудь к этому приду, но пока для меня это сложновато. Пока сделал как подсказал Slym. И это работает. За что ему, большое спасибо! procedure TForm1.Button3Click(Sender: TObject); var s: string; obj: TObject; v:variant; begin with FDQuery1 do begin SQL.Clear; SQL.Add('select * from rab'); OpenOrExecute; end; while not FDQuery1.Eof do begin s := FDQuery1.Fields[1].AsString + '.' + FDQuery1.Fields[2].AsString + ':=' + FDQuery1.Fields[3].AsString + ';'; Memo1.Lines.Add(s); obj := Form1.FindComponent(FDQuery1.Fields[1].AsString); v:=FDQuery1.Fields[3].AsVariant; setpropvalue(obj, FDQuery1.Fields[2].AsString,v); FDQuery1.Next; end; end;
  11. Здравствуйте, Хочу сохранять настройки приложения, например выбранный индекс tabcontrol'a,список listbox'a и т.п. Как можно сделать что то типа такого? procedure TForm1.Button3Click(Sender: TObject); var s,obj,cap,val: string; begin with FDQuery1 do begin SQL.Clear; SQL.Add('select * from rab'); OpenOrExecute; end; while not FDQuery1.Eof do begin s := FDQuery1.Fields[1].AsString +'.'+ FDQuery1.Fields[2].AsString +':='+ FDQuery1.Fields[3].AsString+';'; Memo1.Lines.Add(s); obj:=FDQuery1.Fields[1].AsString; cap:=FDQuery1.Fields[2].AsString; val:=FDQuery1.Fields[3].AsString; //"Component"."properties":="value"; <--------что можно здесь придумать FDQuery1.Next; end; в БД поля хранятся так Можно искать значение для каждого компонента через select values from rab components= name, но это же много разных запросов, мне кажется будут лишние "тормоза", а там не знаю, не пробовал. Для начала решил обратиться за советом сюда.Может можно проще. Как это сделать с помощью ini я знаю, но хотел чтобы развертывался только один файл(БД ), а с ini придется еще один файл добавлять.
  12. Да спасибо, я в основном читаю все на http://docwiki.embarcadero.com там и браузер мне все переводит на русский, а это "там будет описание метода и модуль где он находится System.Threading" не доглядел.Спасибо.Будим учить дальше. P.S Фреймы еще не успел посмотреть, чувствую интересная штука.))
  13. Спасибо, смысл понял(почти), и то благодаря ссылке выше, только пока не понял как это все работает. TTask.run я так понял это независимая процедура которая и может удалить компоненты безболезненно(а tthread.synchronize делает ее еще безопасней?). Вот только редактор ругается на Ttask, может какой-то модуль надо подключить? И я так и не понял откуда ее вызывать(( Из процедуры btn.OnClick := ok;? Извиняюсь за вопросы "чайника". Пишу можно сказать первый проект для себя, и в процессе осваиваю язык.Много чего становится понятным и станавится на свои места в понимании, но еще гораздо больше пока для меня дремучий лес.
  14. Спасибо, так работает. Это по тому принципу что если удаляешь компонент то и удаляется то что на нем? А почему тогда здесь все работает нормально? procedure TForm1.Button29Click(Sender: TObject); var i, j: integer; aImage: TImage; aRect: TRectangle; begin Layout4.BeginUpdate; try // for j := 0 to 30 do // if Layout4.FindComponent('img' + inttostr(j)) <> nil then // Layout4.FindComponent('img' + inttostr(j)).Free; Layout4.DestroyComponents; for i := 0 to ListBox1.Items.Count - 1 do begin aRect := TRectangle.Create(Layout4); aRect.Parent := Layout4; aRect.Position.X := Layout4.Width; aRect.Position.Y := 0; aRect.Align := TAlignLayout.Left; aRect.Stroke.Kind := TBrushKind.None; aRect.Fill.Color := TAlphacolors.Null; aRect.Height := 50; aRect.Width := 50; aRect.Margins.Left := 0; aRect.Margins.Top := 0; aRect.Margins.Right := 0; aRect.Name := 'rect' + i.ToString; aRect.Tag := i; aRect.OnClick := rectClick; aImage := TImage.Create(aRect); aImage.Parent := aRect; aImage.Align := TAlignLayout.Client; aImage.HitTest := false; aImage.Name := 'img' + i.ToString; aImage.Bitmap.Assign(dm.ImageList1.Bitmap(aImage.Size.Size, ListBox1.ListItems.ImageIndex)); aImage.Tag := i; Layout4.Width := Layout4.Width + 50; end; finally Layout4.EndUpdate; end; end;
×
×
  • Создать...