AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur
Thema durchsuchen
Ansicht
Themen-Optionen

Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

Ein Thema von Freyr77 · begonnen am 21. Okt 2016 · letzter Beitrag vom 22. Okt 2016
Antwort Antwort
Freyr77
(Gast)

n/a Beiträge
 
#1

Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:01
Delphi-Version: 10 Seattle
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:
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;
.. 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.
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;
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:05
Zitat:
"Inkompatible Typen: Methodenzeiger und reguläre Prozedur".
Methodenzeiger zeigt auf eine Methode und eine Prozedur ist standalone. Wenn Du solche Events umbiegen willst, müssen die auch in einer Klasse verpackt werden. Liegt an der Signatur von z.b. TNotifyEvent.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:13
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Freyr77
(Gast)

n/a Beiträge
 
#4

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:14
Also sollte ich diese "Checkbox"-Methoden lieber nicht auslagern um sie zusammenzufassen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:23
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 14:56
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?).
Uli Gerhardt
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#7

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 21. Okt 2016, 16:06
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({...});
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Create(self) bei ausgelagerter Funktion, Methodenzeiger und reguläre Prozedur

  Alt 22. Okt 2016, 23:34
Wenn du aus irgendeinem Grund den Weg mit Event Handler gehen willst, kannst du es mit Klassenmethoden versuchen - siehe https://stackoverflow.com/questions/...84676#11084676. Damit ersparst du dir das Erzeugen und Freigeben einer Dummy-Instanz (wie FGridCheckBoxHelp in Blups Post ).
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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