Wichtiger Hinweis

Forum für alles rund um die MSEide und MSEgui
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wichtiger Hinweis

Beitrag von mschnell »

martin_frb hat geschrieben:Ein Problem ist, das die Form, dann nur die neue, aber nicht die alte klasse beinhalten darf.

Das wäre ja der Sinn der Finger-Übung: die alte Klasse wurde grafisch instanziiert und dann in Realtime durch die neue ersetzt. Also enthält das Form (zunächst) die alte.

Und eigentlich suchte ich nach einer "empfohlenen" Lösung. Ich hätte gedacht das es eine relativ "normale" Sache sein könnte, die Eigenschaften eines bereits platzierten Objektes nachträglich zu erweitern. :twisted:

-Michael

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Wichtiger Hinweis

Beitrag von martin_frb »

mschnell hat geschrieben:
martin_frb hat geschrieben:Ein Problem ist, das die Form, dann nur die neue, aber nicht die alte klasse beinhalten darf.

Das wäre ja der Sinn der Finger-Übung: die alte Klasse wurde grafisch instanziiert und dann in Realtime durch die neue ersetzt. Also enthält das Form (zunächst) die alte.

Nein, you misunderstood.

Sagen wir du hast "Unit2.TButton", dann muessen in der gegebenen form alle Buttons "Unit2.TButton" sein. Es darf keine nicht ersetzten buttons geben.

In design time they all show as normal button.
In runtime, sind sie ALLE "Unit2.TButton"

Und eigentlich suchte ich nach einer "empfohlenen" Lösung. Ich hätte gedacht das es eine relativ "normale" Sache sein könnte, die Eigenschaften eines bereits platzierten Objektes nachträglich zu erweitern.

In Interpreter-sprachen: ja.
In Compiler sprachen, eher nicht

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wichtiger Hinweis

Beitrag von mschnell »

Ich habe mein Beispiel mittels "Class Helper" hinbekommen. Das ist dann auch eine "offizielle" nicht-Hacker - Lösung.

Da ich für die Funktionalität ja OnClick überschreiben muss und dazu das alte OnClick speichern muss, um es wieder aufrufen zu könenn, fehlt mir der Speicherplatz für das alte OnClick, weil ClassHelper ja idiotischerweise keine neuen Variablen definieren kann.

Also verwenden wir einen Rucksack-Trick: Tag als Pointer auf ein TNotiFyEvent benutzen und die TNotifyEvent -Variable (die besteht ja aus zwei Pointern) mit New auf dem Heap anlegen.

Schön wäre, wenn FPC Class-Helper Variablen automatisch anlegen könnte (z.B. mit so einem Rucksack-Trick)

Gruß,
-Michael
Zuletzt geändert von mschnell am Mo 30. Jul 2012, 16:50, insgesamt 1-mal geändert.

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Wichtiger Hinweis

Beitrag von Patito »

mschnell hat geschrieben:Ich habe mein Beispiel mittels "Class Helper" hinbekommen. Das ist dann auch eine "offizielle" nicht-Hacker - Lösung.

Wohl eher eine "offizielle" Hacker-Lösung. Class Helper sind Hacks, die Borland erfunden hat um die VCL mit .NET kompatibel gewürgt zu kriegen...
mit solider Programmiertechnik haben die Helper eigentlich nichts zu tun haben... Class Würger wäre eigentlich der richtige Name...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wichtiger Hinweis

Beitrag von m.fuchs »

mschnell hat geschrieben:Ich habe mein Beispiel mittels "Class Helper" hinbekommen. Das ist dann auch eine "offizielle" nicht-Hacker - Lösung.
Da ich für die Funktionalität ja OnClick überschreiben muss und dazu das alte OnClick speichern muss, um es wieder aufrufen zu könenn, fehlt mir der Speicherplatz für das alte OnClick, weil ClassHelper ja idiotischerweise keine neuen Variablen definieren kann.
Also verwenden wir einen Rucksack-Trick: Tag als Pointer auf ein TNotoFyEvent benutzen und die TNotiofyEvent -Variable (die besteht ja aus zwei Pointern) mit New auf dem Heap anlegen.

Also im Grund das gleiche, was meine Helper Klasse oben macht. Einen Nachteil haben übrigens beide Lösungen: wenn programmtechnisch irgendwo OnClick überschrieben wird, kriegt das keiner mit. Von daher auch nur als Hack zu gebrauchen.

mschnell hat geschrieben:Schön wäre, wenn FPC Class-Helper Variablen automatisch anlegen könnte (z.B. mit so einem Rucksack-Trick)

Das wird wohl nicht passieren, weil die Class Helper ja nur eine Art syntaktischer Zucker sind. Das gleiche, was sie können kannst du mit folgendem Konstrukt erreichen:

Code: Alles auswählen

procedure HelperProzedur(AButton: TButton);

Jetzt kann diese Prozedur irgendwas mit AButton machen. Bei einem Class Helper ist es fast genauso, nur dass es so aussieht, als würden die Methoden zur Klasse gehören(*). Mit sauberer Objektorientierung hat das meines Erachtens nicht mehr viel zu tun.

Michael

* Na gut, er kann auch noch Methoden überschreiben und auf Protected-Bereich zugreifen, aber das könnte auch ein Class Cracker.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Wichtiger Hinweis

Beitrag von martin_frb »

mschnell hat geschrieben:Da ich für die Funktionalität ja OnClick überschreiben muss und dazu das alte OnClick speichern muss, um es wieder aufrufen zu könenn, fehlt mir der Speicherplatz für das alte OnClick, weil ClassHelper ja idiotischerweise keine neuen Variablen definieren kann.

Also verwenden wir einen Rucksack-Trick: Tag als Pointer auf ein TNotoFyEvent benutzen und die TNotiofyEvent -Variable (die besteht ja aus zwei Pointern) mit New auf dem Heap anlegen.

Schön wäre, wenn FPC Class-Helper Variablen automatisch anlegen könnte (z.B. mit so einem Rucksack-Trick)


OnClick zeigt doch auf eine Methode. Und die kann zu jeder beliebigen Klasse gehoeren

Code: Alles auswählen

TButtonClickHandler = class
  private
    FButton: TButton;
    FOldOnClick: TNotifyEvent;
  protected
    Procedure HandleClick(Sender: TObject);
  public
    constructor Create;
    destructor Destroy; override;
    Procedure SetButton(AButton);
  end;
 
 
procedure TButtonClickHandler.HandleClick(Sender: TObject);
begin
  // your work. Maybe forward to an event
 
  if Assigned(FOldOnClick) the
    FOldOnClick(Sender);
end;
 
constructor TButtonClickHandler.Create;
begin
  FButton := nil; // should already be
end;
 
destructor TButtonClickHandler.Destroy;
begin
  SetButton(nil);
  inherited Destroy;
end;
 
procedure TButtonClickHandler.SetButton(AButton);
begin
  if FButton= AButton then exit;
 
  if (FButton <> nil) then begin
    Assert(FButton.OnClick = @self.HandleClick);
    FButton.OnClick := FOldOnClick; // can be nil, that is ok
  end;
 
  FButton := AButton;
 
  if (FButton <> nil) then begin
    FOldOnClick := FButton.OnClick; // can be nil, that is ok
    FButton.OnClick := @HandleClick;
  end;
end;


You need to create an instance of this per button. But then you can store as much info as you want.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wichtiger Hinweis

Beitrag von mschnell »

Gut ! So kann man sich den Tag-Trick sparen und das "alte" Event gleich im neuen speichern.

-Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wichtiger Hinweis

Beitrag von m.fuchs »

Die fast gleiche Lösung habe ich schon mal gepostet. :D

Wenn du es noch etwas eleganter haben möchtest, dann könntest du die Hilfsklasse auch eine Liste von Buttons speichern lassen, die sich dann alle dort registrieren können.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Wichtiger Hinweis

Beitrag von martin_frb »

m.fuchs hat geschrieben:Die fast gleiche Lösung habe ich schon mal gepostet. :D


Tatsaechlich.... Sorry, aber ich habs wirklich uebersehen. May the credit be yours.
Hoffentlich wirst Du mich jetzt nicht verklagen...

Antworten