App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Von Objekt auf übergeordnetes Objekt zugreifen
- Ersteller Dalai
- Erstellt am
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Hallo Forum .
Leider lässt sich mein Problem schwierig beschreiben, deswegen auch dieser etwas seltsame Titel. Noch ein Hinweis vorweg: die Fettschreibungen im Code habe ich aus Gründen der Lesbarkeit gemacht, also so eine Art Syntax Highlighting .
Folgendes: ich habe eine Klasse gebastelt, die diverse VCL-Objekte beinhaltet.
Diese Klasse befindet sich - wie sich das gehört - in einer eigenen Unit (bei C/++ wäre sie in einem Header). Im Hauptprogramm werden nun Instanzen dieser Klasse erzeugt und in einem (dynamischen) Feld gespeichert - soweit so schön .
Das OnClick-Ereignis des Buttons wird mithilfe der Methode SetLaunchClick zugewiesen. Ausgeführt wird dann beim Klick auf einen der Buttons eine Methode aus dem Hauptprogramm:
Das Problem hierbei: Sender ist vom Typ TMyButton, also ein "Unterobjekt" meiner Klasse TLaunch. Nun muss ich aber auf diverse Eigenschaften meiner Klasse TLaunch zugreifen. Wie bekomme ich das (sinnvoll) mit wenig Aufwand hin?
Bisher habe ich es so gemacht, dass ich einen Feldindex beim Erzeugen von TLaunch übergeben und der Eigenschaft Tag des TMyButton zugewiesen habe. Dann kann man beim Klicken diese Eigenschaft auslesen und hat den Feldindex. Aber ich denke mir, dass das unsicher sein könnte.
In obigem Code habe ich dem TMyButton zusätzliche Eigenschaften zugeordnet, die ich auslese. Aber das wird natürlich affig, wenn ich an viele Variablen/Eigenschaften meiner Klasse TLaunch ran muss .
Geht das irgendwie besser?
MfG Dalai
Leider lässt sich mein Problem schwierig beschreiben, deswegen auch dieser etwas seltsame Titel. Noch ein Hinweis vorweg: die Fettschreibungen im Code habe ich aus Gründen der Lesbarkeit gemacht, also so eine Art Syntax Highlighting .
Folgendes: ich habe eine Klasse gebastelt, die diverse VCL-Objekte beinhaltet.
Rich (BBCode):
type
TLaunch = class
private
// Standard-Variablen
sCaption : string;
sText : string;
sExecFile : string;
sExecParams : string;
dwExecFlag : DWORD;
// VCL-Objekte
btnButton : TMyButton;
lblText : TLabel;
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
published
procedure SetLaunchClick(event: TNotifyEvent);
end;
Das OnClick-Ereignis des Buttons wird mithilfe der Methode SetLaunchClick zugewiesen. Ausgeführt wird dann beim Klick auf einen der Buttons eine Methode aus dem Hauptprogramm:
Rich (BBCode):
procedure TMainForm.LaunchClick(Sender: TObject);
var SEI: TShellExecuteInfo;
tmyb: TMyButton;
begin
tmyb:= (Sender as TMyButton);
FillChar(SEI, SizeOf(SEI), 0); // Wipe the record to start with
SEI.cbSize:= SizeOf(SEI);
SEI.fMask:= SEE_MASK_NOCLOSEPROCESS;
SEI.Wnd:= Application.Handle;
SEI.lpFile:= PChar(ExtractFileName(tmyb.Exec));
SEI.lpDirectory:= PChar(ExtractFileDir(tmyb.Exec));
SEI.nShow:= tmyb.Flags;
SEI.lpParameters:= PChar(tmyb.Params);
ShellExecuteEx(@SEI);
end;
Bisher habe ich es so gemacht, dass ich einen Feldindex beim Erzeugen von TLaunch übergeben und der Eigenschaft Tag des TMyButton zugewiesen habe. Dann kann man beim Klicken diese Eigenschaft auslesen und hat den Feldindex. Aber ich denke mir, dass das unsicher sein könnte.
In obigem Code habe ich dem TMyButton zusätzliche Eigenschaften zugeordnet, die ich auslese. Aber das wird natürlich affig, wenn ich an viele Variablen/Eigenschaften meiner Klasse TLaunch ran muss .
Geht das irgendwie besser?
MfG Dalai
Zuletzt bearbeitet:
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Hab ich das Problem zu umständlich/unverständlich beschrieben? Oder hat keiner ne Idee? Sollte doch kein Problem sein, dass es Delphi ist, oder? Irgendjemand war doch sicherlich schon in einer solchen/ähnlichen Situation...
Zur weiteren Erklärung: die Ereignisbehandlung OnClick muss im Hauptprogramm stehen, weil ich Daten auf die GUI schreiben muss (bisher noch nicht implementiert). Sowas von einer Unit aus zu machen ist ja nicht so die feine Art. Ich möchte die Programmlogik möglichst von der GUI trennen. Da das Ausgeben der Daten aber recht zeitkritisch geschehen muss, reicht auch keine Methode mit Rückgabe eines Strings o.ä.
MfG Dalai
Zur weiteren Erklärung: die Ereignisbehandlung OnClick muss im Hauptprogramm stehen, weil ich Daten auf die GUI schreiben muss (bisher noch nicht implementiert). Sowas von einer Unit aus zu machen ist ja nicht so die feine Art. Ich möchte die Programmlogik möglichst von der GUI trennen. Da das Ausgeben der Daten aber recht zeitkritisch geschehen muss, reicht auch keine Methode mit Rückgabe eines Strings o.ä.
MfG Dalai
Zuletzt bearbeitet:
KaeptenIglu
Lieutnant
- Mitglied seit
- 04.02.2008
- Beiträge
- 55
- Renomée
- 1
Versuchs mal mit "parent".
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
Parent ist vom Typ TForm (eben die Form, auf dem der Button dargestellt wird) und nicht vom Typ TLaunch. Der Parent muss auch ein VCL-Objekt sein, damit der Button sichtbar wird.Versuchs mal mit "parent".
Inzwischen habe ich eine Lösung gefunden (ereignisbasiert), habe aber noch keine Zeit gehabt, sie hier zu posten. Ich werde es aber in jedem Fall noch tun, wenn ich Zeit dafür finde!
MfG Dalai
Dalai
Grand Admiral Special
- Mitglied seit
- 14.06.2004
- Beiträge
- 7.420
- Renomée
- 262
- Standort
- Meiningen, Thüringen
- Mein Laptop
- Thinkpad T43 mit 15" UXGA (1600x1200), 2x 1 GiB RAM, 100GB HD, Bluetooth, GBit LAN, ATi X300
- Prozessor
- AMD Ryzen 5 2600 (Pinnacle Ridge)
- Mainboard
- ASUS Prime X370-A
- Kühlung
- Noctua NH-U12S mit 1x NF-F12
- Speicher
- Crucial Ballistix Sport LT weiß (BLS2K8G4D32AESCK): 2x 8 GiB DDR4-3200 (CL16) @ 1,25V
- Grafikprozessor
- Zotac GeForce GTX 1060 6GB AMP Edition
- Display
- Dell U2410, 24 Zoll, IPS, 16:10
- SSD
- Samsung 850 Evo 250 GB
- HDD
- WD40EZRZ (WD Blue) 4000GB SATA3, WD20EZRX (WD Green) 2000GB SATA3
- Optisches Laufwerk
- Pio DVR-212 (DVD-RAM), ASUS E818A6T (DVD-ROM), Pio DVD-106S (Slot-in DVD-ROM)
- Soundkarte
- Creative SoundBlaster Audigy 2 ZS PCI
- Gehäuse
- Lian Li PC-8NB Midi-Tower
- Netzteil
- Enermax EMP400AGT MaxPro 400W
- Betriebssystem
- Windows 7 Professional x64 und immer mal wieder ein neues Linux :-)
- Webbrowser
- Mozilla Firefox mit diversen Erweiterungen
- Verschiedenes
- 2x 120mm Gehäuselüfter (Front und Rückwand), DVBSky T9580, Sharkoon Frontpanel B (2x USB 3.0)
So, ab geht's zur Lösung .
Erklärung des Ganzen: das OnClick-Ereignis des Buttons btnButton wird auf ein Ereignis OnButtonClick der Klasse TLaunch umgeleitet. Oder anders ausgedrückt: wenn man den Button klickt, wird das Ereignis OnClick des Buttons und damit das Ereignis OnButtonClick von TLaunch ausgelöst. Dazu brauchen wir:
Die Implementation der Methode ButtonClick sieht dann so simpel aus:
Damit beim Klick auf den Button auch was passiert, kann man z.B. im Konstruktor von TLaunch diese Zuweisung machen:
Damit wird die Methode ButtonClick aufgerufen und diese wiederum ruft die Methode auf, die von außerhalb der Klasse auf das Ereignis OnButtonClick zugewiesen wurde. Diese Zuweisung des Ereignisses (im Hauptprogramm) sieht folgendermaßen aus:
Damit ändert sich die Methode LaunchClick wie folgt:
Damit ist sichergestellt, dass man ein TLaunch-Objekt bekommt und kann dann auf die Eigenschaften desselben zugreifen . Das Schöne daran: man kann das mit beliebigen Ereignissen ergänzen, wenn nötig, also z.B. OnLabelClick o.ä. Man braucht dann wieder die gleichen Sachen wie oben zu sehen.
Wenn man einmal die Ereignisse begriffen hat, geht's eigentlich ganz einfach .
MfG Dalai
Erklärung des Ganzen: das OnClick-Ereignis des Buttons btnButton wird auf ein Ereignis OnButtonClick der Klasse TLaunch umgeleitet. Oder anders ausgedrückt: wenn man den Button klickt, wird das Ereignis OnClick des Buttons und damit das Ereignis OnButtonClick von TLaunch ausgelöst. Dazu brauchen wir:
- eine Methode zur Behandlung des Ereignisses OnButtonClick (private)
- ein public TNotifyEvent, um von außen eine Ereignis-Zuweisung machen zu können
- im Hauptprogramm eine Zuweisung und eine Methode für die Behandlung des Ereignisses
Rich (BBCode):
type
TLaunch = class
private
// Standard-Variablen
sCaption : string;
sText : string;
sExecFile : string;
sExecParams : string;
dwExecFlag : DWORD;
// VCL-Objekte
btnButton : TButton;
lblText : TLabel;
procedure ButtonClick(Sender: TObject); // Methode zur Ereignisbehandlung
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
OnButtonClick: TNotifyEvent; // Ereignis deklarieren
published
property ExecFile: string
read sExecFile;
property ExecParams: string
read sExecParams;
property ExecWorkDir: string
read sExecWorkDir;
property ExecFlag: DWORD
read dwExecFlag;
end;
Code:
procedure TLaunch.ButtonClick(Sender: TObject);
begin
if Assigned(OnButtonClick) then OnButtonClick(Self);
end;
Code:
Self.btnButton.OnClick:= ButtonClick;
Code:
var launch: TLaunch;
launch:= TLaunch.Create(MainForm);
launch.OnButtonClick:= MainForm.LaunchClick; // Ereignisbehandlungsroutine zuweisen
Rich (BBCode):
// --- Ereignisbehandlung für OnButtonClick
procedure TMainForm.LaunchClick(Sender: TObject);
var
// normale Ausführung
SEI: TShellExecuteInfo;
obj: TLaunch;
begin
obj:= (Sender as TLaunch);
FillChar(SEI, SizeOf(SEI), 0); // Wipe the record to start with
SEI.cbSize:= SizeOf(SEI);
SEI.fMask:= SEE_MASK_NOCLOSEPROCESS;
SEI.Wnd:= Application.Handle;
SEI.lpFile:= PChar(ExtractFileName(obj.ExecFile));
SEI.lpDirectory:= PChar(obj.ExecWorkDir);
SEI.nShow:= obj.ExecFlag;
SEI.lpParameters:= PChar(obj.ExecParams);
ShellExecuteEx(@SEI);
end;
Wenn man einmal die Ereignisse begriffen hat, geht's eigentlich ganz einfach .
MfG Dalai
Zuletzt bearbeitet:
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 52K
- Antworten
- 0
- Aufrufe
- 134K