![]() |
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:
MfG
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; schuetze09 [edit=sakura] Leerzeichen in den Quelltext eingelassen. Mfg, sakura[/edit] |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
versuch das ganze mal mit nem @ davor...
|
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
habe ich auch schon probert, dann kommt:
"Inkompatible Typen: TVSTGetTextEvent und Pointer" |
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. |
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 |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Moin Schuetze09,
Zitat:
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). |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Eine Möglichkeit gibts noch:
Code:
Mfg
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; Phantom1 |
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 |
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:
unter public deklariert. So kann ich dann in meiner NewTab-Unit die procedure dem Event OnGetText zuordnen.
procedure VST_Edit_OnGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
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 |
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.
|
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
@jim_raynor: und wie am besten?
mfg schuetze09 |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Man baut sich einfach eine Dummy-Klasse mit der Funktion.
Delphi-Quellcode:
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.
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; 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. |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Danke, werde ich mal ausprobieren.
MfG schuetze09 |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
@jim_raynor: Super es funktioniert, jetzt gehört zusammen, was logisch zusammen gehört!!!
MfG schuetze09 |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Moin Schütze09,
jetzt darfst Du nur nicht vergessen, die Instanz der Klasse auch wieder freizugeben. |
Re: Inkompatible Typen: Methodenzeiger und reguläre Prozedur
Zitat:
Da kommt mir gerade die Idee, dass es ja ausreicht einmal das Objekt zu erzeugen. implentation
Delphi-Quellcode:
dann kann man immer g_DummyObjekt verwenden, anstatt jedesmal eine neue Instanz anzulegen.
var
g_DummyObjekt: TTabManagerClass; initizialization g_DummyObjekt:=TTabManagerClass; finalization FreeAndNil(g_DummyObjekt); |
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