Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie geht das mit den Methodenzeigern (https://www.delphipraxis.net/107947-wie-geht-das-mit-den-methodenzeigern.html)

sebi87 5. Feb 2008 07:51


Wie geht das mit den Methodenzeigern
 
Hallo Leute,

ich bin am verzweifeln, ich hab eine Methodenzeiger
Delphi-Quellcode:
type TFormatOnGetText = procedure(Sender: TField; var Text: String; DisplayText: Boolean) ;
dann hab ich eine Variable definiert
Delphi-Quellcode:
_FormatOnGetText: TFormatOnGetText ;
Ok soweit alles klar und jetzt will ich diesem Zeiger eine Procedure
Delphi-Quellcode:
procedure (Sender: TField; var Text: String; DisplayText: Boolean) ;
begin
  Text := FormatFloat('000000', Sender.AsInteger);
end;
übergeben aber das bekomme ich nicht hin.
Kann mir da jemand helfen?


Grüßle Sebastian

sirius 5. Feb 2008 08:01

Re: Wie geht das mit den Methodenzeigern
 
Zitat:

Zitat von sebi87
Hallo Leute,

ich bin am verzweifeln, ich hab eine Methodenzeiger

Nein, das ist ein Funktionszeiger.

Zitat:

Zitat von sebi87
dann hab ich eine Variable definiert

ok.

Zitat:

Zitat von sebi87
Ok soweit alles klar und jetzt will ich diesem Zeiger eine Procedure

Was willst du jetzt übergeben? Methode oder Prozedur/Funktion?

sebi87 5. Feb 2008 08:29

Re: Wie geht das mit den Methodenzeigern
 
Zitat:

Nein, das ist ein Funktionszeiger.
Ok das würde erkären waurm das nicht geht.

Wie muss ich den Zeiger definieren wenn ich die Procedure
Delphi-Quellcode:
procedure (Sender: TField; var Text: String; DisplayText: Boolean) ;
begin
  Text := FormatFloat('000000', Sender.AsInteger);
end;
Wie muss ich dann den Zeiger auf die Procedure definieren?

Grüßle Sebastian

xaromz 5. Feb 2008 08:35

Re: Wie geht das mit den Methodenzeigern
 
Hallo,
Zitat:

Zitat von sebi87
Ok das würde erkären waurm das nicht geht.

nein, tut ess nicht.

Zitat:

Zitat von sebi87
Wie muss ich dann den Zeiger auf die Procedure definieren?

Die Definition des Zeigers ist schon korrekt. Du hast eine Prozedur und einen Prozedur-Zeiger. Oder ist das in Wirklichkeit eine Methode? Dann musst Du den Pointer so schreiben:
Delphi-Quellcode:
type TFormatOnGetText = procedure(Sender: TField; var Text: String; DisplayText: Boolean) of object;
Gruß
xaromz

sebi87 5. Feb 2008 08:38

Re: Wie geht das mit den Methodenzeigern
 
Und wie übergebe ich diesem Procedurzeiger
Delphi-Quellcode:
type TFormatOnGetText = procedure(Sender: TField; var Text: String; DisplayText: Boolean)
(Ist doch ein Procedurzeger)
meine Procedure?

Dani 5. Feb 2008 08:41

Re: Wie geht das mit den Methodenzeigern
 
Vor allem solltest du deiner Prozedur mal nen Namen geben:

Delphi-Quellcode:
procedure MachWas(Sender: TField; var Text: String; DisplayText: Boolean) ;
begin
  Text := FormatFloat('000000', Sender.AsInteger);
end;

{...}

_FormatOnGetText := MachWas;

Nuclear-Ping 5. Feb 2008 08:42

Re: Wie geht das mit den Methodenzeigern
 
Zum Beispiel:
Delphi-Quellcode:
type
  TForm1 = class (TForm)
    // ...
  private
    procedure MyFormatOnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
    // ...
  end;

// ...

implementation

procedure TForm1.MyFormatOnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
  // ... Dein Code
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  _FormatOnGetText := MyFormatOnGetText;
end;
Wenn _FormatOnGetText eine globale Variable ist, mußt du glaube oben bei der Deklaration das "... of object" weglassen und die Prozedur aus der Klasse rausnehmen.

taaktaak 5. Feb 2008 08:46

Re: Wie geht das mit den Methodenzeigern
 
Moin, Moin,
hast du nicht mit TFormatOnGetText einen neuen Ereignistyp deklarieren wollen, der deine Variable _FormatOnGetText lesen/schreiben soll? Wenn dem so ist, dann fehlt doch die published-Deklaration

Delphi-Quellcode:
published
  property OnGetText : TFormatOnGetText read _FormatOnGetText write _FormatOnGetText
Oder habe ich das jetzt falsch verstanden?
Gruß Ralph

Muetze1 5. Feb 2008 08:47

Re: Wie geht das mit den Methodenzeigern
 
Zitat:

Zitat von Nuclear-Ping
Wenn _FormatOnGetText eine globale Variable ist, mußt du glaube oben bei der Deklaration das "... of object" weglassen und die Prozedur aus der Klasse rausnehmen.

Der letzte Teil stimmt, aber es hat nichts damit zu tun, ob es als globale Variable oder lokal definiert ist zu tun.

sebi87 5. Feb 2008 08:49

Re: Wie geht das mit den Methodenzeigern
 
Allso
was ich eigentlich machen wollte, einen Globalen DB-Handler schreiben der die Ausagbe meiner Datenbank bein AfterOpen Ereignis der Query Formatiert.

taaktaak 5. Feb 2008 08:58

Re: Wie geht das mit den Methodenzeigern
 
Dann soll also ein vorhandenes Event OnAfterOpen erweitert/verändert werden?

sebi87 5. Feb 2008 09:04

Re: Wie geht das mit den Methodenzeigern
 
Also ursprünglich hab ich diese Procedure
Delphi-Quellcode:
procedure TJRK_GruppenForm.FormatOnGetMGNr(Sender: TField; var Text: String; DisplayText: Boolean);
begin
  Text := FormatFloat('000000', Sender.AsInteger);
end;
lokal definiert und hier aufgerufen
Delphi-Quellcode:
procedure TJRK_GruppenForm.QryMitgliederAfterOpen(DataSet: TDataSet);
begin
  Dataset.FieldByName('Mitgliedernummer').OnGetText := FormatOnGetMGNr ;
end;
Jetzt wollte ich diese Procedure in eine globale Unit Globals setzetn damit ich sie überall verwenden kann.
Aber es kommt dan immer der Fehler
[Fehler] JRK_Gruppen.pas(177): Inkompatible Typen: Methodenzeiger und reguläre Prozedur

taaktaak 5. Feb 2008 09:10

Re: Wie geht das mit den Methodenzeigern
 
Hmm, wäre es nicht der einfachste Weg, die Prozedur in der Unit zu belassen und im public-Abschnitt zu veröffentlichen?

sebi87 5. Feb 2008 09:27

Re: Wie geht das mit den Methodenzeigern
 
da ist nur das Problem das die Unit nicht immer vorhanden ist und ich somit nicht auf diese zugreifen kann.
Gibt es keine Möglichkeit diese auszulagern?

Nuclear-Ping 5. Feb 2008 09:50

Re: Wie geht das mit den Methodenzeigern
 
Für Datenbank-Sachen empfiehlt es sich, ein eigenes "Data Modul" zu haben.

sebi87 5. Feb 2008 10:37

Re: Wie geht das mit den Methodenzeigern
 
Wie meinst du das mit dem DataModul?

Nuclear-Ping 5. Feb 2008 11:41

Re: Wie geht das mit den Methodenzeigern
 
Ein DataModul kannst du über Datei -> Neu anlegen.

Da sollte man in Anwendungen, die über Datenbanken laufen, alle datenbankspezifischen Komponenten (TConnection, TQuery, TTable, ...) reinpacken. Es ist sozusagen ein Container, eine eigene Unit, eine eigene Klasse, aber keine Form.

Da kannst du auch deinen Handler dann unterbringen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz