Autor |
Beitrag |
hasnpapa
Hält's aus hier
Beiträge: 4
Delphi 2005
|
Verfasst: Di 16.05.06 20:47
Hallo,
habe mir aus Spaß ein kleines Programm geschrieben, das aus Bildern in einem Verzeichnis eine HTML-Tabelle für meine Homepage erstellt. Mittlerweile klappt das einwandfrei und ich bin ganz stolz.
Jetzt, da ja alles klappt, wollte ich gerne den Quellcode etwas besser strukturieren. Das brachte mich auf die tolle Idee, einzelne Programmteile in Units auszulagern. Seit Sonntag Abend doktere ich daran herum .....
Mein Problem (nicht lachen):
Ich möchte der Einfachheit halber damit beginnen, das Schreiben der .ini, (Werte aus den Eingabefeldern, Pfad etc.) in einer separaten Unit, in einer Funktion
" procedure schreibe_ini(.....)"
auszulagern. Damit ich die Werte nicht in einer ellenlangen Liste einzeln übergeben muss, wäre es natürlich praktisch, einfach eine Referenz auf meine "TForm1" zu übergeben um dann auf die einzelnen Felder/Werte zuzugreifen. Ich kriegs nicht hin  *brettvormkopf*.
Wie muss denn der Funktionsaufruf bzw. die Funktionsdeklaration geschrieben werden, damit das klappt? Habe es mit Dingen wie
schreibe_ini(TForm1: TForm)
und anders versucht.
Hat wer einen Tipp für mich?
Danke
Robert
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Di 16.05.06 20:55
_________________ Markus Kinzler.
|
|
hasnpapa 
Hält's aus hier
Beiträge: 4
Delphi 2005
|
Verfasst: Di 16.05.06 22:03
Hallo Markus,
danke, habe entsprechend geändert (die sympatische Variante mit 'self' genommen). Die Felder sind jedoch noch immer nicht in der Unit bekannt.
Hier mal der Code meiner Versuchs-Unit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| unit show_path;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls;
procedure show_the_path(Form: TForm);
implementation
procedure show_the_path(Form: TForm); begin ShowMessage('Bin in show_path: ' + Form.Edit1.Text); end;
end. |
... und hier das "Hauptprogramm"
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: 30: 31:
| unit test;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, show_path;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin show_the_path(self); end;
end. |
Also, sorry, wenn ich mich da so ungeschickt anstelle. Als ewig prozeduraler OOP-Verdränger, der gerade Delphi erobert, stoße ich hier auf ein Problem, das ich schlichtweg nicht erkenne. Gibt es da noch etwas das ich übersehen habe? Warum kann ich per Punkt-Notation nicht auf Edit1 zugreifen?
Danke
Robert
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Di 16.05.06 22:09
Zitat: | Warum kann ich per Punkt-Notation nicht auf Edit1 zugreifen? |
Weil Edit1 kein Member der Klasse TForm ist.
Heißen die Kompoenenten, auf diese du zugreifen willst immer gleich oder soll die Prozedur automatsich den Inhalt des Formulars auslesen?
_________________ Markus Kinzler.
|
|
hasnpapa 
Hält's aus hier
Beiträge: 4
Delphi 2005
|
Verfasst: Di 16.05.06 22:45
[quote=" mkinzler"] Zitat: |
Heißen die Kompoenenten, auf diese du zugreifen willst immer gleich oder soll die Prozedur automatsich den Inhalt des Formulars auslesen? |
hmmmm.... ist das eine Fangfrage?
Nein, Spaß beiseite. Ich verstehe/erkenne den Hintergrund der Frage nicht, vermute jedoch mal, es gäbe da zwei Lösungsansätze, darum einfach in meinen eigenen Worten:
Das Formular enthält Felder wie "cellpadding, cellspacing, rows, colums, etc ...." und eine TDirectoryListBox, TFileListBox. Die heißen eigentlich alle immer gleich.
Beim FormCreate möchte ich die Felder natürlich auch wieder vorbelegen, also muss ich auf die Komponenen auch schreibend zugreifen können.
Das mit der .ini (schreiben, lesen) etc. ist kein Problem - so lange sich alles in einer einziegen Quäldatei befindet. Ich kann die Werte natürlich auch alle einzeln übergeben, auch das klappt.
Was ich jedoch einfach nicht schaffe zu kapieren ist, wie kann ich aus einer anderen Unit auf Komponenten des Haptprogrammes zugreifen und deren Werte per Punktnotation auslesen bzw. verändern, wenn ich nur eine Referenz auf die Form an die Prozedur in der anderen Unit übergebe. Dieses Problem wird mir bestimmt auch in anderer Weise, mal vom einfachen Schreiben einer .ini, wieder begegnen. Wenn ich es mal grundsätzlich kapieren würde .....
Danke
Robert
|
|
NeoInDerMATRIX
      
Beiträge: 245
Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
|
Verfasst: Di 16.05.06 23:45
Hallo,
wie schon weiter oben erwähnt wird das tEdit nicht in der Unit Form deklariert, demzufollge kennt deine Unit auch nicht diesen Typen. Du must einfach noch die Unit die tEdit beinhaltet noch mit in die Uses Klausel mit aufnehmen.
Cu
Neo
P.S.:  Ich habe etwas zu schnell gelesen. Du must natürlich bei deiner Procedure nicht den Type tForm benutzen sondern den Typen der Form den du für dein Fenster nutzt. Also in dem fall tForm1. Denn tForm beinhaltet ja laut deklaration keine Edit oder sonst irgend etwas.
|
|
hasnpapa 
Hält's aus hier
Beiträge: 4
Delphi 2005
|
Verfasst: Mi 17.05.06 18:55
Erst mal danke, an euch beide.
Scheinbar krieg ich die kurve zu oop einfach nicht gebacken. 20 Jahre prozedurale Sprachen (Pascal, Basic, C, Forth, Perl, JS und PHP) ruinieren scheinbar das Hirn .... ich komm mir gerade vor wie ein Idiot
Verkrieche mich jetzt erst mal mit meinen schlauen Büchern und versuche den Knoten aus meinem Hirn zu bekommen.
Grüße
Robert
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 17.05.06 19:12
Zitat: | Ich verstehe/erkenne den Hintergrund der Frage nicht, vermute jedoch mal, es gäbe da zwei Lösungsansätze, darum einfach in meinen eigenen Worten: |
ja es ging um den möglichen Lösungsansatz. Wenn das Formular immer gleich aussieht (z.B. für die Funktionlität deiner Prozedur) könntest du diesen Aufbau in eine Superklasse definieren, von welcher du dann die eigentlichen Formulare ableitest. Der Prozedur übergibst du dann eine Instanz der Superklasse.
_________________ Markus Kinzler.
|
|
|