![]() |
Delphi-Version: 10 Seattle
Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Ich lagere gerade doppelte Funktionen/Prozeduren aus meinen Codes(zusammenhängend in einem Programm, aber jeder Code ein separater Programmbestandteil) in eine Art "Settings" Unit aus.
Jetzt bin ich auf ein Problem gestoßen. Ich habe folgende Funktion:
Delphi-Quellcode:
.. die in beiden Codes vorkommt. Jetzt hab ich das Problem das er mir das Create(self) anmeckert, und komm gerade nicht auf die Lösung.
var
lChkBox: TGridCheckBox; begin if (pColumn <> 0) AND (pRow = 0) then Exit; lChkBox := TGridCheckbox.Create(inherited); with lChkBox do begin Column := pColumn; Row := pRow; parent := Grid; Checked := True; Caption := ''; Width := ChkboxWidth; Height := ChkboxHeight; OnMouseDown := CheckboxMouseDown; Visible := false; Invalidate; end; Grid.Objects[pColumn, pRow] := lChkBox; Result := lChkBox; end; Ich dachte es geht mit "inherited", aber das ist es auch nicht. Zweites Problem, in der gleichen Funktion. Hier wird ja "CheckBoxMouseDown" aufgerufen, welches ebenfalls in beiden Codes als Prozedur drinnen war. Das hab ich jetzt auch in meine "Settings" unit integriert, allerdings sagt er da jetzt "Inkompatible Typen: Methodenzeiger und reguläre Prozedur". "CheckBoxMouseDown" sieht so aus:
Delphi-Quellcode:
var
lChkBox: TGridCheckBox; begin if Button = TMouseButton.mbLeft then begin lChkBox := (Sender as TGridCheckbox); lChkBox.Checked := not lChkBox.Checked; end; end; |
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Zitat:
|
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Methoden-Zeiger haben 2 Zeiger drin (Zeiger auf Prozedur und den Zeiger auf's Objekt)
und Prozedurzeiger nur Einen. (Zeiger auf Prozedur) Methoden haben einen unsichtbaren "Self"-Parameter. (außer statische Klassenmethoden). Und dann gibt es noch Zeiger auf anonyme Methoden. nur Variablen/Event-Property vom Typ "refereces to procedur/function" können Alles speichern. Bei allem Anderen passt nur genau das rein, für was die Variable ausgelegt ist. |
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Also sollte ich diese "Checkbox"-Methoden lieber nicht auslagern um sie zusammenzufassen?
|
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Da Events nunmal Methoden-Zeiger sind, kannst du da auch nur Methoden zuweisen.
Methoten sind "Prozeduren", die in "irgendeiner" Klasse definiert sind. Das können normale Instanz-Methoden (nur keine mit "static") oder Klassen-Methoden sein. |
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Wenn du immer nur ein und dasselbe CheckboxMouseDown hast, würde ich das nicht über einen OnMouseDown-Handler lösen, sondern direkt TGridCheckbox.DoMouseDown überschreiben (oder heißt's TGridCheckbox.MouseDown?).
|
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Vieleicht so:
Delphi-Quellcode:
TGridCheckBoxHelp = class(TComponent)
protected procedure CheckBoxMouseDown({...}); public procedure CreateCheckBox({...}); end; procedure TGridCheckBoxHelp.CreateCheckBox({...}); var lChkBox: TGridCheckBox; begin if (pColumn <> 0) AND (pRow = 0) then Exit; lChkBox := TGridCheckbox.Create(Grid); // Freigabe übernimmt das Grid oder Self with lChkBox do begin Column := pColumn; Row := pRow; parent := Grid; Checked := True; Caption := ''; Width := ChkboxWidth; Height := ChkboxHeight; OnMouseDown := CheckboxMouseDown; Visible := false; Invalidate; // Invalidate für ein unsichtbares Steuerelement? end; Grid.Objects[pColumn, pRow] := lChkBox; Result := lChkBox; end; {z.B. im Show des Formulars} FGridCheckBoxHelp := TGridCheckBoxHelp.Create(Self); // Freigabe übernimmt Self (das Formular) FGridCheckBoxHelp.CreateCheckBox({...}); |
AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Wenn du aus irgendeinem Grund den Weg mit Event Handler gehen willst, kannst du es mit Klassenmethoden versuchen - siehe
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 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