Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Inkompatible Typen: Methodenzeiger und reguläre Prozedur (https://www.delphipraxis.net/44160-inkompatible-typen-methodenzeiger-und-regulaere-prozedur.html)

schuetze09 14. Apr 2005 14:44


Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Hallo,

folgendes Problem, ich erstelle dynamisch Komponenten und ihnen Proceduren zuweisen.
Leider läuft das schief.

Hat einer ne Idee?

so sieht mein Code (gekürzt) aus:
Delphi-Quellcode:
unit NewTab;

uses ...;

procedure NeuerTab;

procedure VST_Edit_OnGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;


var anzSQL:Integer = 0;
    VST_Edit: array of TVirtualStringTree;
    Sheet : array of TTabSheet;


procedure NeuerTab;
begin
  SetLength(Sheet, anzSQL +1);
  SetLength(VST_Edit, anzSQL +1);

  Sheet[anzSQL]:=TTabSheet.Create(Form_Main.PageControl_NewTab);
  Sheet[anzSQL].Parent:=Form_Main.PageControl_NewTab;
  Sheet[anzSQL].PageControl:=Form_Main.PageControl_NewTab;
  Sheet[anzSQL].Caption:='Query '+ IntToStr(Form_Main.PageControl_NewTab.PageCount -1);
 
  VST_Edit[anzSQL]:=TVirtualStringTree.Create(Sheet[anzSQL]);
  VST_Edit[anzSQL].Parent:=Sheet[anzSQL];
  with VST_Edit[anzSQL] do
  begin
    Align:=alClient;
    BorderStyle:=bsNone;
    Header.Background:=clSkyBlue;
    Header.Style:=hsFlatButtons;
    Header.Options:=[hoColumnResize,hoDblClickResize,hoDrag,hoVisible];
    TreeOptions.PaintOptions:=[toShowButtons, toShowDropmark, toShowHorzGridLines, toShowTreeLines, toShowVertGridLines, toThemeAware, toUseBlendedImages, toFullVertGridLines];
    TreeOptions.SelectionOptions:=[toFullRowSelect];
    Name:=NamePrefixVST + IntToStr(anzSQL);
    OnGetText:=VST_Edit_OnGetText; //GEHT NICHT
  end;

  inc(anzSQL);
end;
MfG
schuetze09

[edit=sakura] Leerzeichen in den Quelltext eingelassen. Mfg, sakura[/edit]

glkgereon 14. Apr 2005 14:54

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
versuch das ganze mal mit nem @ davor...

schuetze09 14. Apr 2005 15:00

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
habe ich auch schon probert, dann kommt:
"Inkompatible Typen: TVSTGetTextEvent und Pointer"

Robert Marquardt 14. Apr 2005 15:05

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Methoden und Funktionen sind auch immer inkompatibel.
Methoden haben einen zusaetzlichen Parameter Self.

Nein es geht nicht den einer Funkton zu verpassen.

Mal ueber "of object" in der Hilfe nachlesen.

schuetze09 14. Apr 2005 15:08

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
@Robert Marquardt: dann werde ich wohl lesen müssen

Ich hatte gedacht, es gibt dafür eine schnelle kleine Lösung )-:

MfG
schuetze09

Christian Seehase 14. Apr 2005 16:41

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Moin Schuetze09,

Zitat:

Zitat von schuetze09
Ich hatte gedacht, es gibt dafür eine schnelle kleine Lösung )-:

gibt's.

Hättest Du die Überschrift mal in der Suche eingegeben, wärst Du vermutlich auf einige Threads mit dem gleichen Thema gestossen ;-)


BTW:
Kurze und schnelle Lösung:
Mach, wie Dir die Fehlermeldung fast schon vorschlägt, aus der Prozedur eine Methode (z.B. auch vom Formular).

Phantom1 14. Apr 2005 20:52

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Eine Möglichkeit gibts noch:
Code:
procedure FormClick(Self: TForm; Sender: TObject);
begin
  ShowMessage('OK');
end;

procedure TForm1.FormCreate(Sender: TObject);
var Event: TNotifyEvent;
begin
  with TMethod(Event) do begin
    Code:=@FormClick;
    Data:=Self;
  end;
  Self.OnClick:=Event; // geht !
end;
Mfg
Phantom1

Muetze1 15. Apr 2005 00:18

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Moin!

Ja, super, und? Nun haste da was hingefakt. Super! - aber was ist, wenn du kein Self hast, weil du keine Klasse hast? Warum nutzt du keine Methode von TForm1, wenn du es schon darin alles aufbaust und zuweist?

Fragen über Fragen....

Das ist doch auch nur ein Hack mit TMethod - warum nicht gleich eine kleine Klasse mit statischen Methoden? Die kann man zuweisen und die Klasse muss noch nichtmal angelegt werden...

MfG
Muetze1

schuetze09 15. Apr 2005 06:01

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Hallo,

ich habe es jetzt wie folgt gemacht, gefällt mir zwar nicht so, aber es geht:

in meiner MainForm habe ich
Delphi-Quellcode:
procedure VST_Edit_OnGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
unter public deklariert. So kann ich dann in meiner NewTab-Unit die procedure dem Event OnGetText zuordnen.

Nicht schön, aber es geht. Eigentlich müssten die proceduren in die NewTab-Unit, da ja dort die Komponenten dynamisch erstellt werden und vom rein logischen Zusammenhang her müssten sie da drin stehen.

MfG
schuetze09

jim_raynor 15. Apr 2005 06:04

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Du könntest dir in NewTab auch eine Hilfsklasse schreiben in der du die Funktion packen kannst.

schuetze09 15. Apr 2005 06:11

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
@jim_raynor: und wie am besten?

mfg
schuetze09

jim_raynor 15. Apr 2005 07:39

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Man baut sich einfach eine Dummy-Klasse mit der Funktion.

Delphi-Quellcode:
type
  TTabManagerClass = class
  private
  public
    procedure VST_Edit_OnGetText(Sender: TBaseVirtualTree; Node: PVirtualNode);
  end;

implementation

procedure TTabManagerClass.VST_Edit_OnGetText(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
end;


.
.
.

Temp:=TTabManagerClass.Create;
OnGetText:=Temp.VST_Edit_OnGetText;
Ist nur ein Ansatz und ungetestet. Problem ist natürlich, das speicherleichen hinterlassen werden. Eventuell klappt es ohne Instanzen, wenn man Klassen-Funktionen nutzt, aber das weiß ich im Moment nicht.

Aber mir ist gerade aufgefallen, dass du auch direkt auf die Main_Form Instanz zugreifst. Würde dir da empfehlen, der Procedure das PageCOntrol zuübergeben, damit du unabhängig bist.

schuetze09 15. Apr 2005 08:57

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Danke, werde ich mal ausprobieren.

MfG
schuetze09

schuetze09 15. Apr 2005 09:19

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
@jim_raynor: Super es funktioniert, jetzt gehört zusammen, was logisch zusammen gehört!!!

MfG
schuetze09

Christian Seehase 15. Apr 2005 09:45

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Moin Schütze09,

jetzt darfst Du nur nicht vergessen, die Instanz der Klasse auch wieder freizugeben.

jim_raynor 15. Apr 2005 10:09

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Zitat:

Zitat von Christian Seehase
Moin Schütze09,

jetzt darfst Du nur nicht vergessen, die Instanz der Klasse auch wieder freizugeben.

Deshalb mein Hinweis mit den Speicherleichen. Das Problem ist ja, wann das Objekt wieder freigegeben wird.

Da kommt mir gerade die Idee, dass es ja ausreicht einmal das Objekt zu erzeugen.

implentation

Delphi-Quellcode:
var
  g_DummyObjekt: TTabManagerClass;

initizialization

  g_DummyObjekt:=TTabManagerClass;

finalization

  FreeAndNil(g_DummyObjekt);
dann kann man immer g_DummyObjekt verwenden, anstatt jedesmal eine neue Instanz anzulegen.

schuetze09 15. Apr 2005 10:36

Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
 
Das ist natürlich auch eine Lösung (gute).

MfG
schuetze09


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 Uhr.

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