Autor |
Beitrag |
gd0123456
      
Beiträge: 33
|
Verfasst: Mo 06.05.13 17:12
Hallo Leute, schreibe gerade an einem Programm, aufgrund der zahlreichen Funktionen möchte ich es in eine extra Unit einbauen (zwecks der Übersicht).
Die Unit einbinden im richtigen Form trage ich bei Uses ein. Die Funktionen soll eben überall anwendbar sein.So jetzt mein Problem.
wenn ich eine Procedure habe z.B. Procedure xxx (f: Tform) möchte ich als Parameter die form übergeben damit ich auf die einzelnen Elemente zugreifen kann die auf der Form positioniert sind. Gibt es da eine Möglichkeit.
Unit Function
procedure xxx(f: Tform);
begin
f.label1.caption := 'test';
end;
Aufruf in Form1:
xxx(Form1);
Gibt es eine Möglihckeit wie ich elemente aus einer anderen Unit / Form ansprechen kann bzw. es als Parameter übergeben?
Die Units gegenseitig einbinden funktioniert leider nicht.
OK einen Teil habe ich bereis gelöst, nach implemnation kann man ebenfalls uses schreiben und somit kann sie gegenseitig einbinden ohne Probleme
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 06.05.13 17:54
gd0123456 hat folgendes geschrieben : | OK einen Teil habe ich bereis gelöst, nach implemnation kann man ebenfalls uses schreiben und somit kann sie gegenseitig einbinden ohne Probleme |
Und was ist jetzt noch das Problem, wenn man mal davon absieht, dass das katastrophaler Programmierstil und ein Verbrechen gegen die Objektorientierung ist?
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 06.05.13 19:31
1. Du solltest als Bezeichner niemals geschützte Begriffe wie function nehmen. Nenne deine Unit anders, z.B. Unit Funktionen.
2. Es gibt in Units immer zwei Möglichkeiten, eine Uses-Klausel schreiben, einmal unter Interface und einmal unter Implementaion.
3. Procedure MachWasAufDerForm(MyForm : TForm); - warum sollte das nicht funktionieren? Probier's doch einfach mal aus!
4. Man kann schon Units gegenseitig einbinden, jedoch sollten die einzubindenden Units dann immer in der Uses-Klausel unter Implementation stehen. Wenn sie unter Interface stehen, funktioniert das selbstverständlich nicht.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mo 06.05.13 19:37
Nur dass man bei TForm keinen Zugriff auf die daraufliegenden Controls hat, da müsste man nämlich die spezifische Formklasse (z.B. TFormMain) angeben. Im Übrigen sollte man zirkuläre Einbindungen nach Möglichkeit vermeiden. Und davon ganz abgesehen ist die Frage nach dem Sinn des Ganzen wohl nicht unberechtigt.
Für diesen Beitrag haben gedankt: FinnO
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 06.05.13 19:38
WasWeißDennIch hat folgendes geschrieben : | da müsste man nämlich die spezifische Formklasse (z.B. TFormMain) angeben. |
oder zumindest mehr oder weniger hart casten.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mo 06.05.13 19:41
Oder hardcore mit der RTTI herumfummelt. Ob sich der Aufwand allerdings lohnt...
|
|
gd0123456 
      
Beiträge: 33
|
Verfasst: Mo 06.05.13 20:09
Also danke mal für die Antworten.
also das mit Uses und einbinden hat sich bereits erledigt. Danke für die Hilfe.
Ich möchte eben von der jeweiligen form (spezifisch) auf das daraufliegende Control zugreifen können. Mal kann es auf der Form4 liegen mal auf der Form1. Und damit ich nur einen Procedure/Funktion schreiben möchte, müsste ich eben die From angeben damit ich darauf zugreifen kann. Wenn ich einen Variable anlegen mit f: TForm1. Ja dann kann ich eben auf das Control zugreifen, nur wenn ich es eben spezifisch machen möchte dann hab ich leider keine Idee wie es gehen soll.
Möchte ja in der Prozedur / Function spezifisch auf Elemente zugreifen.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 06.05.13 20:12
Moin,
dein Problem ist meiner Meinung nach von eher grob-konzeptueller Natur. Vielleicht solltest du mal ein paar Details und vor allem mehr Code veröffentlichen.
Gruß
|
|
gd0123456 
      
Beiträge: 33
|
Verfasst: Mo 06.05.13 20:31
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| -- unit 2 --
function getMandant(text: string, f: Tform): string; var aktiv_mandant: integer; mandant_name: string; begin f.label1.caption := 'hurra';
f.adoconnection1.ConnectionString :=' MSDASQL.1;Persist Security Info=False;Data Source=xxxx'; f.adodataset1.CommandText := 'select mandant_id from aktiver_mandant'; f.adodataset1.Active := true; aktiv_mandant := strtoint(form1.adodataset1.FieldByName('mandant_id').Text); f.adodataset1.Next; f.adodataset1.Close; f.adoconnection1.Close;
end;
-- unit 1 --
uses unit2;
procedure TForm1.FormShow(Sender: TObject); begin form1.Caption := getMandant('Suchen - ',form1); end; |
So ich möchte jetzt der FormShow die richtige Form übergeben so dass wie in dem Beispiel eben das ado von der richtigen Form verwendet wird. ADO ist jetzt nur ein Beispiel kann was anderes auch sein, egal welches Element und egal auf welcher Form es liegt.
Wenn ich die Form4 übergebe dann soll Label1.caption von der Form4 geändert werden, wenn ich Form1 dann eben von der Form1. Und ich möchte eben eine generelle Funktion schreiben.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 06.05.13 20:52
Ne, so macht man das nicht.
Und vor allem: Warum ist der Mandant bei dir keine Klasse, die den Datenbankzugriff kapselt? MVC!
Wenn du das allerdings unbedingt so machen möchtest, brauchst du eine etwas andere Klassenstruktur:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type DataForm = class(TForm) ADOKomponenten : TADOKomponenten; end;
type Form1 = class(DataForm) end; |
Delphi-Quelltext 1:
| function getMandant(text: String, f : DataForm) : string; |
|
|