Autor Beitrag
hasnpapa
Hält's aus hier
Beiträge: 4


Delphi 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 16.05.06 20:55 
ausblenden Delphi-Quelltext
1:
2:
procedure schreibe_ini(Form: Tform);
...

Aufruf:

ausblenden Delphi-Quelltext
1:
schreibe_ini(TForm1);					

bzw.
ausblenden Delphi-Quelltext
1:
schreibe_ini( self);					

_________________
Markus Kinzler.
hasnpapa Threadstarter
Hält's aus hier
Beiträge: 4


Delphi 2005
BeitragVerfasst: 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:
ausblenden 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"
ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4


Delphi 2005
BeitragVerfasst: Di 16.05.06 22:45 
[quote="user profile iconmkinzler"]
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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.: :oops: 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 Threadstarter
Hält's aus hier
Beiträge: 4


Delphi 2005
BeitragVerfasst: 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 :roll:

Verkrieche mich jetzt erst mal mit meinen schlauen Büchern und versuche den Knoten aus meinem Hirn zu bekommen.


Grüße
Robert
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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.