Liebes Lazarusforum,
ich habe folgendes Problem. Ich habe mehrere formulare, die über eine procedure verfügen (backupload() ), die in jedem Formular anders ist, überall aber gleich heißt. Das Hauptfomular besitzt eine Procedure, die ein formular als in-wert übertragen bekommt und soll in diesem Formular nun die procedur backupload aufrufen.
Geht das überhaupt? Der ansatz ist ja recht objektorientiert..
Aufrufen von gleichbenannten proceduren in versch, Fomularen
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen
"Objektorientiert" ist das nicht gerade. Wenn du die Methode einer Klasse (hier TForm) aufrufst, dann musst du die Klasse sowieso angeben: Form1.Backup() vs. Form2.Backup(). Oder verstehe ich das Problem nicht richtig?
Funktionen mit gleichem Namen werden per overload gekennzeichnet. Die Auswahl erfolgt dann automatisch.
Funktionen mit gleichem Namen werden per overload gekennzeichnet. Die Auswahl erfolgt dann automatisch.
Code: Alles auswählen
public
function Add(a,b:byte):byte;overload;
function Add(a,b:integer):integer;overload;
Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen
nein da hast Du mich ein wenig missverstanden. meine procedure im Hauptformular würde so aussehen:
procedure tfhaupt.backupprior(form:tform);
begin
...
form.backupload();
...
end;
jenachdem, wie ich die procedure nun aufrufe, soll die procedure des entsprechenden formulares gestartet werden. So wie das dasteht funktioniert es aber nun mal nicht.
In Java hätte ich einfach ein interface gabastelt und alles wäre OK, aber so etwas kenne ich in PASCAL nicht.
procedure tfhaupt.backupprior(form:tform);
begin
...
form.backupload();
...
end;
jenachdem, wie ich die procedure nun aufrufe, soll die procedure des entsprechenden formulares gestartet werden. So wie das dasteht funktioniert es aber nun mal nicht.
In Java hätte ich einfach ein interface gabastelt und alles wäre OK, aber so etwas kenne ich in PASCAL nicht.
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen
- Ändere deinen Entwurf so ab, dass die Formulare ihre Funktion als Ereignis/Callback selbst bekannt geben.
- Erstelle eine Formular-Klasse, die nichts weiter macht, als dieses Methode zu deklarieren. Von dieser leitest du alle anderen Formulare ab.
Interfaces gibt es in Pascal auch; einfach in der Dokumentation (Sprachreferenz) suchen.karkov hat geschrieben:In Java hätte ich einfach ein interface gabastelt und alles wäre OK, aber so etwas kenne ich in PASCAL nicht.Code: Alles auswählen
var proc: procedure of object; proc := frm.MethodAdress('backupload'); proc()
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen
In MSEide, Lazarus ist sicher ähnlich:
Mit interface:
Martin
Code: Alles auswählen
type
tbackupform = class(tmseform)
protected
class function hasresource: boolean; override;
//not necessary if tbackupform is a design time form
public
procedure backupload; virtual; abstract;
end;
tbackupform1 = class(tbackupform)
protected
class function hasresource: boolean; override;
//not necessary if tbackupform1 inherits from
//design time form tbackupform by 'File'-'New'-'Form'-'Inherited Form'
public
procedure backupload; override;
end;
tbackupform2 = class(tbackupform)
protected
class function hasresource: boolean; override;
//not necessary if tbackupform2 inherits from
//design time form tbackupform by 'File'-'New'-'Form'-'Inherited Form'
public
procedure backupload; override;
end;
tfhaupt = class(tmseform)
public
procedure backupprior(const aform: tbackupform);
end;
implementation
{ tbackupform }
class function tbackupform.hasresource: boolean;
begin
result:= false;
end;
{ tbackupform1 }
class function tbackupform1.hasresource: boolean;
begin
result:= true;
end;
procedure tbackupform1.backupload;
begin
// load backup
end;
{ tbackupform2 }
class function tbackupform2.hasresource: boolean;
begin
result:= true;
end;
procedure tbackupform2.backupload;
begin
// load backup
end;
{ tfhaupt }
procedure tfhaupt.backupprior(const aform: tbackupform);
begin
aform.backupload;
end;
Code: Alles auswählen
type
{$interfaces corba}
ibackup = interface ['{46B70DC4-9E09-4611-9F92-F39C3881E4FC}']
procedure backupload;
end;
tbackupform1 = class(tmseform,ibackup)
public
procedure backupload;
end;
tbackupform2 = class(tmseform,ibackup)
public
procedure backupload;
end;
tfhaupt = class(tmseform)
public
procedure backupprior(const aform: tmseform);
end;
implementation
{ tbackupform1 }
procedure tbackupform1.backupload;
begin
// load backup
end;
{ tbackupform2 }
procedure tbackupform2.backupload;
begin
// load backup
end;
{ tfhaupt }
procedure tfhaupt.backupprior(const aform: tmseform);
var
intf1: ibackup;
begin
if aform.getinterface(ibackup,intf1) then begin
intf1.backupload;
end;
end;
Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen
Ok, die Theorie ist mir jetzt klar, aber ich habe noch ein Problem mit der Konkreten umsetzung. Wo muss ich denn in meinem Projekt eine Klasse vormulieren? Oder muss ich eine extra Pas-Datei erstellen, mit dem Interface oder der Klasse und sie dann in das Programm importieren? Und wenn ja, wie genau geht das?