Results 1 to 13 of 13

Thread: property GetText wordt niet uitgevoerd in Firemonkey

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243

    property GetText wordt niet uitgevoerd in Firemonkey

    Lastige plek om te bepalen waar deze topic moet, maar omdat het met databases te maken heeft zet ik het toch hier neer.

    Ik heb een klein programma gemaakt in FMX om het resultaat te tonen van een ronde alsmede de stand van de competitie. Daarvoor maak ik gebruik van 2 tabellen. Omdat het voorkomt dat 2 spelers dezelfde naam hebben, wordt ook hun vriendcode getoond (iets van pokemon).
    In VCL gebruik ik deze code:
    Delphi Code:
    1. procedure TDMModule.rondendlnr1naamGetText(Sender: TField; var Text: string;
    2.   DisplayText: Boolean);
    3. begin
    4.   Text := format('%s (%s)',[ronden.FieldByName('dlnr1naam').AsString, ronden.FieldByName('dlnr1vriendcode').AsString])
    5. end;
    Dat werkt prima. Twee velden worden aan elkaar 'geplakt' en getoond op het scherm.

    Hetzelfde doe ik ook met FMX. Maar deze code wordt NIET uitgevoerd. Ik heb er een break op staan, maar daar gaat de debugger helemaal niet naartoe. Dan kan je zeggen dat de debugger uitstaat, maar bij een andere plek wordt de break wel uitgevoerd.

    Het kan zijn dat ik gebruik maak van Devart, maar naar mijn weten is de GetText een onderdeel van Delphi zelf.

    Zijn er andere, die deze ervaring hebben ondervonden en daar e.v.t. een oplossing voor hebben?
    Delphi is great. Lazarus is more powerfull

  2. #2
    En waar hangt de event rondendlnr1naamGetText aan?

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,226
    ...waarschijnlijk via een persistent field, maar wat nu als je voor de zekerheid, in bijvoorbeeld de OnCreate, "Hard" je veld (ook) aan deze event hangt?
    Dus iets van:
    Code:
    rondendlnr1naam.OnGetText := rondendlnr1naamGetText;
    ?
    TMemoryLeak.Create(Nil);

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243
    In welke oncreate bedoel je, Peter?
    Delphi is great. Lazarus is more powerfull

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,226
    Geen idee, ik ben niet bekend met FireMonkey.

    Bij VCL zou ik zeggen in de FormCreate of de DataModuleCreate waar je dataset op staat, maar of FMX ook dergelijke events heeft, dat weet ik niet.
    TMemoryLeak.Create(Nil);

  6. #6
    Zijn het speciale datasets alleen voor FMX?

    Je zou zeggen dat als het niet speciaal voor FMX is dat het gewoon hetzelfde moet werken.

    Misschien dat de fmx-dbedit de data op een andere manier vinden trekt.

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243
    De MyDAC versie werkt zowel voor VCL als voor FMX. Ik zal morgen eens een push naar die procedure doen om te kijken of dat wel werkt.
    Wat ik ook kan doen is een demo met een memdataset maken en kijken of die hetzelfde resultaat geeft.
    Delphi is great. Lazarus is more powerfull

  8. #8
    Ja, maar je gebruikt een tdbedut voor fmx. Je zou eens kunnen kijken of rechtsreeks TField.DisplayText of .Text aan te roepen om te kijken of het dan wel getriggerd wordt.

    http://docwiki.embarcadero.com/Libra...ield.OnGetText
    Occurs when the DisplayText or Text property of the field is referenced.
    Misschien laat de fmx versie van dbedit niet de displaytext zien.

  9. #9
    I7 7700K 32Gb Win10 Pro Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    1,822
    Speciaal voor Videoripper(peter)

    Click image for larger version. 

Name:	events.PNG 
Views:	2 
Size:	12.9 KB 
ID:	7780
    Nog steeds veel in Delphi2010, maar ook Lazarus 1.8.2

  10. #10
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,226
    Quote Originally Posted by Wok View Post
    Speciaal voor Videoripper(peter)


    Het leek mij al apart als deze er niet in zou zitten, maar ja: bij TFrame vond ik het in eerste instantie
    ook raar dat hij er juist niet inzat, dus sta nergens meer van te kijken.
    TMemoryLeak.Create(Nil);

  11. #11
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243
    Dit werkt (met een memtable, waarin een ander bugje zit, maar dat terzijde)
    Delphi Code:
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    7.   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
    8.   FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
    9.   FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
    10.   Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Stan.StorageBin,
    11.   System.Rtti, FMX.Grid.Style, Data.Bind.EngExt, Fmx.Bind.DBEngExt,
    12.   Fmx.Bind.Grid, System.Bindings.Outputs, Fmx.Bind.Editors,
    13.   Data.Bind.Components, Data.Bind.Grid, Data.Bind.DBScope,
    14.   FMX.Controls.Presentation, FMX.ScrollBox, FMX.Grid, FMX.StdCtrls;
    15.  
    16. type
    17.   TForm1 = class(TForm)
    18.     FDMemTable1: TFDMemTable;
    19.     FDMemTable1naam: TStringField;
    20.     FDMemTable1leeftijd: TIntegerField;
    21.     StringGrid1: TStringGrid;
    22.     BindSourceDB1: TBindSourceDB;
    23.     BindingsList1: TBindingsList;
    24.     LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
    25.     Button1: TButton;
    26.     StringGrid2: TStringGrid;
    27.     FDMemTable2: TFDMemTable;
    28.     BindSourceDB2: TBindSourceDB;
    29.     LinkGridToDataSourceBindSourceDB2: TLinkGridToDataSource;
    30.     FDMemTable2naam: TStringField;
    31.     FDMemTable2leeftijd: TSmallintField;
    32.     procedure FormCreate(Sender: TObject);
    33.     procedure FormShow(Sender: TObject);
    34.     procedure Button1Click(Sender: TObject);
    35.     procedure FDMemTable2naamGetText(Sender: TField; var Text: string;
    36.       DisplayText: Boolean);
    37.   private
    38.     { Private declarations }
    39.   public
    40.     { Public declarations }
    41.   end;
    42.  
    43. var
    44.   Form1: TForm1;
    45.  
    46. implementation
    47.  
    48. {$R *.fmx}
    49.  
    50. procedure TForm1.Button1Click(Sender: TObject);
    51. begin
    52.   FDMemTable2.Active := true;
    53.   FDMemTable2.CopyDataSet(fdmemtable1,[coRestart,coAppend]);
    54. end;
    55.  
    56. procedure TForm1.FDMemTable2naamGetText(Sender: TField; var Text: string;
    57.   DisplayText: Boolean);
    58. begin
    59. text := format('%s (%d)',[FDMemTable2.Fields[0].AsString, FDMemTable2.Fields[1].AsInteger]);
    60. end;
    61.  
    62. procedure TForm1.FormCreate(Sender: TObject);
    63. begin
    64.   FDMemTable1.CreateDataSet;
    65.   FDMemTable1.Active := true;
    66. end;
    67.  
    68. procedure TForm1.FormShow(Sender: TObject);
    69. begin
    70.   FDMemTable1.AppendRecord(['john',40]);
    71.   FDMemTable1.AppendRecord(['daphne',43]);
    72.   FDMemTable1.AppendRecord(['klaas',46]);
    73. end;
    74.  
    75. end.
    Delphi is great. Lazarus is more powerfull

  12. #12
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243
    Als ik een TMyConnection en TMyQuery rechtstreeks op het form zet, wordt het event wel getriggerd. Maar ik maak gebruik van een datamodule en een object.
    Delphi Code:
    1. procedure TDMModule.HaalRondeOp(const aWedstrijdID, aRonde: smallint;
    2.   aRondelijst: TObjectlist<Tronde>);
    3. var compronde : TRonde;
    4. begin
    5.   ronden.Params[0].AsInteger := aWedstrijdID;
    6.   ronden.Params[1].AsInteger := aronde;
    7.   ronden.Active := true;
    8.   while not ronden.Eof do
    9.   begin
    10.     compRonde := TRonde.Create;
    11.     compRonde.tafel       := ronden.FieldByName('tafel').AsInteger;
    12.     compRonde.dlnr1       := ronden.FieldByName('dlnr1naam').AsString;
    13.     compRonde.dlnr2       := ronden.FieldByName('dlnr2naam').AsString;
    14.     compRonde.punt1       := ronden.FieldByName('dlnr1punt').AsInteger;
    15.     compRonde.punt2       := ronden.FieldByName('dlnr2punt').AsInteger;
    16.     arondelijst.Add(compronde);
    17.     ronden.Next;
    18.   end;
    19.   ronden.Active := false;
    20. end;
    Die doet niet wat die moet doen. Als het veld, waarin de method ongettext is gevuld, wordt aangeroepen, dan zal er een trigger moeten plaatsvinden om de text te formateren.

    Ik ga zoeken naar een workaround.
    Delphi is great. Lazarus is more powerfull

  13. #13
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,243
    Ik heb het zo opgelost.
    Delphi Code:
    1. compRonde.dlnr1       := format('%s, (%s)',[ronden.FieldByName('dlnr1naam').AsString,
    2.                                                 ronden.FieldByName('dlnr1vriendcode').AsString]);
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •