-
Content Count
332 -
Joined
-
Last visited
-
Days Won
1
Everything posted by Serge_G
-
FMX TListView with dynamicappearance. Create progress bar as bitmap.
Serge_G replied to skyzoframe[hun]'s topic in FMX
Hi, if you mean something like this (my first try) I use this code unit UnitProgess; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, Data.Bind.GenData, System.Rtti, System.Bindings.Outputs, FMX.Bind.Editors, Data.Bind.EngExt, FMX.Bind.DBEngExt, Data.Bind.Components, Data.Bind.ObjectScope, FMX.ListView, Fmx.Bind.GenData; type TForm18 = class(TForm) ListView1: TListView; PrototypeBindSource1: TPrototypeBindSource; BindingsList1: TBindingsList; LinkListControlToField1: TLinkListControlToField; procedure ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); private { Déclarations privées } public { Déclarations publiques } end; var Form18: TForm18; implementation {$R *.fmx} procedure TForm18.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); var pBitMap: TBitmap; // for further purpose pListItemImage : TListItemImage; begin if AItem.Purpose = TListItemPurpose.None then begin pListItemImage:=AItem.Objects.FindObjectT<TListItemImage>('ProgressBar'); if assigned(pListItemImage) then begin pListItemImage.Bitmap.Width:=400-(abs(PrototypeBindSource1.DataGenerator.FindField('intfield1').GetTValue.AsInteger)*10); pListItemImage.Bitmap.Clear(Talphacolors.RED); end; end; end. Quick designed But I shall investigate more because this "version" need a link to (bitmap1 -> Item.ProgressBar) I was enabled to add a bitmap directly (PlistItemImage is unassigned if there is no link)- 12 replies
-
- dynamicappearance
- tlistview
-
(and 2 more)
Tagged with:
-
Hi I am trying to split an Image stored in a first TImageList into a second TImageList all my attempts to access a multiresbitmap contained in a TImagelist show an error on program exit TImageListHelper = class helper for TImageList function Add(aBitmap: TBitmap): integer; end; var Form18: TForm18; implementation {$R *.fmx} uses FMX.MultiResBitmap; procedure TForm18.Button1Click(Sender: TObject); var sbitmap, pBitmap: TBitmap; vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; begin Images.ClearCache; Images.BeginUpdate; if Images.Destination.Count > 0 then Images.Destination.Clear; vSource := ImageList1.Source.Items[1]; vBitmapItem := vSource.MultiResBitmap.ItemByScale(1, True, True); sbitmap := vBitmapItem.Bitmap; pBitmap := TBitmap.Create(100, 100); try for var l := 0 to 3 do for var c := 0 to 3 do begin var r: TRect := TRect.Create(pBitmap.Width * c, pBitmap.Height * l, pBitmap.Width * c + pBitmap.Width, pBitmap.Height * l + pBitmap.Height); pBitmap.CopyFromBitmap(sbitmap, r, 0, 0); Images.Add(pBitmap); end; finally pBitmap := nil; // if not an EAccessViolation exception raised when program close pBitmap.Free; end; Images.EndUpdate; end; { TImageListHelper } 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; AccessViolation if pbitmap:=nil is omitted >>EAccessViolation exception in module taKinFMX.exe in 00008338 >>Violation of access to the address 00408338 in the module 'taKinFMX.exe'. Reading of the address FFFFFFFC. ... >> The instruction at 0x0000000000408338 uses the memory address 0x00000000FFFFFFFC. Memory state cannot be read. and cause Unexpected Memory Leaks An unexpected memory leak has occurred. The unexpected small block leaks are: 29 - 36 bytes: TD2DBitmapHandle x 1, TBitmapImage x 1 45 - 52 bytes: TBitmap x 1 61 - 68 bytes: Unknown x 1 Where does I go wrong ? Is there another way to split (like during design time) an image ?
-
Take in mind that in the another imagelist (let say the source one) I have various images and the goal is to have the destination list filled with only one of these. I found the problem deeply looking in the code used in the helper. (helper I merged) uses FMX.MultiResBitmap; procedure TForm18.Button1Click(Sender: TObject); const SCALE = 1; var pBitmap : TBitmap; sbitmap : TCustomBitmapItem; vSource: TCustomSourceItem; vBitmapItem: TCustomBitmapItem; vDest: TCustomDestinationItem; vLayer: TLayer; begin Images.ClearCache; Images.BeginUpdate; if Images.Destination.Count > 0 then Images.Destination.Clear; vSource := ImageList1.Source.Items[0]; sbitmap := vSource.MultiResBitmap.ItemByScale(SCALE, True, True); pbitmap:=TBitmap.Create(100,100); try for var l := 0 to 3 do for var c := 0 to 3 do begin var r: TRect := TRect.Create(100*c,100* l, 100*c+100,100*l+100); pBitmap.CopyFromBitmap(sbitmap.Bitmap, r, 0, 0); // add source bitmap vSource := Images.Source.Add; vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; vSource.MultiResBitmap.SizeKind := TSizeKind.Source; vSource.MultiResBitmap.Width := Round(pBitmap.Width / SCALE); vSource.MultiResBitmap.Height := Round(pBitmap.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(pBitmap); vDest := Images.Destination.Add; vLayer := vDest.Layers.Add; vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width, vSource.MultiResBitmap.Height); vLayer.Name := vSource.Name; end; finally pBitmap.Free; end; Images.EndUpdate; end; And now I can play
-
FMX Keydown converts F4 to 's' and trigger my button's click()
Serge_G replied to EdwardG's topic in FMX
Good thing to report it another time because I don't know if EMB report RSP of a version to another one (hope so but ...), even if you should have a "closed : duplicate case" (I'm used to this kind of response when I report one) Yes, there are quite some but decreasing (even if I don't use 10.4 for production, I should make another try with 10.4.2 when I'll be a little less busy). My idea for IDE crashes : LSP is a good thing but need memory, more than 4Mo I recommend 8 minima (I will soon make my HP laptop open-heart surgery to 16 I think) Still mine, and now I am a FMX, LiveBindings fan, all my new desktop pro applications (even if Windows only) are FMX, but the first steps were hard! -
Hi, For me, filter expressions complies only with the old LocalSQL of BDE so no STARTS nor CONTAINING. Usually, I don't use tables, only querys to avoid this problem, and some Query data components have the good idea to offer macros to manage this sort of case
-
FMX Keydown converts F4 to 's' and trigger my button's click()
Serge_G replied to EdwardG's topic in FMX
Hi, It's a known and reported bug RSP-16453, till your post I had no idea of this one No idea, except modifying unit containing TWinAcceleratorKeyRegistry -
I should not be so affirmative. @MarkShark it's a FMX.TListView not a VCL one. @Michele If you think : style of an item like for a FMX.TListBox, yes you can't change Item style. You can only change Appearance and only use one for all the list, The Dynamic appearance is one of the most adaptable. if you think : changing background colors you can You can see above a personalized style, quick done, I only change itembackground.Color and buttontext.Color (listviewappearance = ImageListItemRightButton)
-
Help to create a Query and Display the results in a dbGrid
Serge_G replied to Mikheil's topic in Databases
It's a "business layer" so I should say DataModule and perhaps TDataSource on Form Agree with haentschman but "Like" can't be "parametrized". Anyway you have the macro solution https://www.devart.com/mydac/docs/devart.dac.tcustomdadataset.macros.htm So your query should be like this Select * from <tablename> &where and the code and this should respond your second interrogation (you can even use a macro for table name Query.SQl.Text := 'select Bla from Bubb &where' Query.MacroByName('where').AsString := Format('WHERE FIELD1 LIKE %s AND FIELD2 LIKE %s',[QuotedStr('%'+value1+'%'),QuotedStr('%'+value2+'%')]); Query.Open; -
It depends on whether you are using a dynamic skin or not. I wrote a few posts and tutorials (in French) on the subject. Anyway if you can't read French, googletrad should be your friend blog : https://www.developpez.net/forums/blogs/138527-sergiomaster/ tutorials list : https://serge-girard.developpez.com/ in my mind this one https://serge-girard.developpez.com/tutoriels/Delphi/Livebindings/ListView/
-
Hi, I was afraid of, but no, I wrote a quick test (I don't use Grid often) and my conclusion is : no problem found.
-
Problem with firedac and Russian - Greek letters in android
Serge_G replied to Savvas M's topic in Cross-platform
Hi, Maybe this is the same problem as arabic, a font problem and not a database problem. I don't remember in which post I saw that, but I remember changing some emb. units did the trick for arabic. ( changing those 3 files FMX.TextLayout.GPU, FMX.FontGlyphs and FMX.FontGlyphs.Android. ) -
What about free DBeaver ? https://dbeaver.io/
-
Really ? IMHO, This would be a bad idea, if Firedac was not with Pro and Community (with no source is acceptable). Another pack of free component is ZEOSLIB (also named ZEOSDBO), also BDE Like, can be installed on Community Edition
-
The best book I think about is Delphi in Depth : Firedac by Cary Jensen If your aim is FireBird don't use IB Components, well and even for Interbase Firedac is better. Firedac is BDE like so the step between D4 and D10.4 is not so large (for this point and with Firedac) Ok, so in this case, should I suggest to use SQLite and a GUI like SQLite Studio ?
-
Hi, I am surely doing something wrong there, but I can't understand where. I wrote a FDSQLiteFunction (well more than one) All of these return me widestrings, I was expecting Currency, Date, Currency. Note, first one came from help http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.SQLite_Sample procedure TDM.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); begin // from sample AOutput.AsCurrency := AInputs[0].AsCurrency * AInputs[1].AsInteger; end; procedure TDM.FDSQLiteFunctionAAAAMMJJ2DateCalculate( AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); var vSDate : String; vDate : TDate; begin vsDate:=AInputs[0].AsString; vDate:=EncodeDate(StrToInt(Copy(vsdate,1,4)), StrToInt(Copy(vsdate,5,2)), StrToInt(Copy(vsdate,7,2))); AOutput.AsDate:=vDate; end; procedure TDM.FDSQLiteFunctionMontantCalculate( AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); var vMontant : Currency; IMontant : String; begin IMontant:=AInputs[0].AsString; Vmontant:=StrToFloat(IMontant); if Ainputs[1].AsString='-' then vMontant:=Vmontant * -1; AOutput.AsCurrency:=vMontant; end; Don't understand why! Ok, it's at design time, but I think that matters.
-
Hi, In other words how FMXStyleViewer manage to apply styles that are not windows'ones?
-
I try this before Dmitry response, but does not work at design time for declaring fields (keep in mind : Livebindings) Thanks anyway. Is there anyway to flag discussion as solved on this forum?
-
Thanks, Dmitry, I was not aware of this special construction to remap a column. This does the trick 🙇♂️ and brighten my day
-
Well, I was thinking it was a sort of VCL vs FMX thing but no. If I look at your grid I see that resultmult column is as string (align left) Like me have a widestringfield object FDQuery1MNT: TWideStringField AutoGenerateValue = arDefault FieldName = 'MNT' Origin = 'MNT' ProviderFlags = [] ReadOnly = True Size = 32767 end And this is my problem, if you use Livebindings a real one at design time! A note for this function // Select id,montant,sens, // testmnt(sens,montant) as MNT, -- function1 // asIntvalue(sens) as IntSens, -- function2 // montant*asIntvalue(sens) MNTBIS from ecritures procedure TForm11.FDSQLiteFunction2Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); begin try if AInputs[0].AsString='+' then AOutput.AsInteger:=1 else AOutput.AsInteger:=-1; except Aoutput.AsInteger:=0; end; end; if you declare fields at design time you have a widestringfield, no fields declared it is a largeint value and MNTBIS a currency value
-
Well, there was a mistake in the database , column aInput[0] is a string in French format so with " ," as decimal point aInput[1] if a char '+' or '-'. Don't fire at the pianist, that's not my database! In the same way, the format of the date vDate:=EncodeDate(StrToInt(Copy(vsdate,1,4)), StrToInt(Copy(vsdate,5,2)), StrToInt(Copy(vsdate,7,2))); I am in doubt because of base 0,1 string and, yes, I forgot the StrToDateTimeDef but problem remains. I exposed my problem with the first fuction procedure TDM.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject); begin // from sample AOutput.AsCurrency := AInputs[0].AsCurrency * AInputs[1].AsInteger; end; And this one, see second picture, give me a widestring not a currency field
-
Hi, This one UPDATE CUSTOMER SET COUNTRY = Case When COUNTRY='USA' then :MYCOUNTRY When COUNTRY <> 'USA' then COUNTRY End should be replaced by UPDATE CUSTOMER SET COUNTRY='USA' WHERE COUNTRY=:MYCOUNTRY; And this UPDATE EMPLOYEE SET TAXBASE= Case When SHAREHOLDER='Y' then (BRUTSALARY * :EMPPORTION /100) * :TMONTH End end by UPDATE EMPLOYEE E SET E.TAXBASE=E.BRUTSALARY*:EMPORTION/100)*:TMONTH WHERE E.SHAREHOLDER='Y';
-
Hi I had the idea to migrate an application using TRestxxxxx from 10.3 to version 10.4 and bad news! 😖 With 10.3 Restdebugger proposed to copy: a THTTPBasicAutenthicator, a TRESTClient, a TRESTRequest, a TRESTResponse, a TRESTResponseDatasetAdapter and an FDmemTable. With 10.4 I only end up with the first 4 in itself, it wouldn't matter if I could later add the other two except that ... my results are not there, I should get several rows, I get only one So, my migration does not work. What note of release would I have missed ? How to do my migration in this case ! Rio Sidney
-
Well, my QP was for 10.4.1 not 10.4.2 and I was really surprise when Dimitry supplies RestDebugger of 10.4.2. But on another hand this gave me reason to expect correction with the future realease
-
Well this is a rule I knew and accept the warning, but anybody that can go to Quality Portal can see Dimitry response no ? And I think a good new have to be shared. Don't know how to mark solved on this forum
-
Hi, Dmitry gave me a look on 10.4.2 RestDebugger, problem solved. Patrick (another MVP beta tester of 10.4.2) confirm me that this new version works as I was expecting. So, I will wait for this new version.