2015-07-29 5 views
5

ich mein eigenes Verfahren zu OnGetText Ereignis von Feldern in einer dynamischen Abfrage festlegen möchtenDelphi: Einstellung OnGetText Event-Handler für die Felder einer dynamischen Abfrage

Mein Verfahren ist wie folgt:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 

    ... 

end; 
  • "... Captions" sind String-Array-Konstanten

ich den Event-Handler in Onafteropen Fall ADOQuery gesetzt:

procedure TImportFrm.ADOQueryAfterOpen(DataSet: TDataSet); 
var 
I : Integer; 
begin 
for I := 0 to ADOQuery.FieldCount - 1 do 
    ADOQuery.Fields[I].OnGetText := MainFrm.MyFieldGetText; 
end; 

Aber nach dem Öffnen von ADOQuery gibt es keinen Text zum Anzeigen, es sieht so aus, als wäre der Textwert leer!

Es scheint, es nicht das, was mein Verfahren zu tun ist egal, denn wenn ich eine leere Prozedur gesetzt (ohne Code), kein Text angezeigt zu

was schief geht?

dank ...

+0

Handler mit dem Debugger prüfen (einen Haltepunkt an der ersten Zeile gesetzt) ​​ – mjn

+0

danke, aber wie ich schon sagte: " Es scheint, dass es egal ist, was meine Prozedur macht, denn wenn ich eine leere Prozedur (ohne Code) einstelle, wird kein Text angezeigt. " –

+1

Möchten Sie gegen Sender.FieldName statt Sender.Name überprüfen? – Jason

Antwort

3

Try this:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 
    if Sender.FieldName = 'XX' then 
    begin 
    Text := .... String(Sender.Value);// (or Text := Sender.AsString); 
    end; 
    if Sender.FieldName = 'YY' then 
    begin 
    Text := .... String(Sender.Value);// (or Text := Sender.AsString); 
    end; 
    ... 

end; 
+1

Warum die Verzweigung für 'FieldName' dann? Sie könnten direkt schreiben 'Text: = Sender.AsString;'. – TLama

+0

@TLama Weil OP dies geschrieben hat, bevor er die Frage bearbeitet hat. –

1

Dank all

Das Problem war, dass ich alle Situationen von Text erwähnen sollte und Sender.value statt verwenden sollten Text auf der rechten Seite! , Änderte ich mein Verfahren zu diesem und Problem gelöst:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 
if Sender.AsVariant = Null then 
    Exit; 

Text := Sender.AsString; 

if MatchStr(Sender.FieldName, BooleanFieldNames) then 
    Text := BooleanCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BNStatus' then 
    Text := BNStatusCaptions[Sender.AsInteger]; 

if MatchStr(Sender.FieldName, ['FStatus', 'LStatus', 'FirstStatus']) then 
    Text := FLStatusCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'PayType' then 
    Text := PayTypeCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BGType' then 
    Text := BGTypeCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'Updated' then 
    Text := UpdatedCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'DieUser' then 
    Text := DieUserCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'LiveUser' then 
    Text := LiveUserCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'NVStatus' then 
    Text := NVStatusCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BSGender' then 
    Text := BSGenderCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BSMType' then 
    Text := BSMTypeCaptions[Sender.AsInteger]; 

end; 

Thanks again ...

+0

hast du meine antwort gesehen? –

+0

Ja und als Up-Vote markiert und als Antwort akzeptiert!Danke –

+1

Sie können "Sender.AsInteger" anstelle von "StrToInt (Sender.Value)" verwenden, wenn diese Felder vom Integer-Typ sind. – TLama