Autor |
Beitrag |
Xearox
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: Sa 23.01.10 23:09
und zwar will ich meine Hauptunit in mehrer Units aufteilen, da ich einfach die Übersicht verloren habe...
Nun hab ich das Problem, das ich in Unit 3 die ganzen Buttons nicht in den Proceduren verwenden kann...
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: 32: 33: 34:
| unit Unit3;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, math, ExtCtrls,Unit2,Unit1;
procedure Baukosten;
implementation
procedure TForm1.Baukosten;
var Stufe:integer;
begin MetKosten:=RessChangeMet; KrisKosten:=RessChangeKris; ZiviKosten:=RessChangeZivis; SoldisKosten:=RessChangeSoldis; Lager:=LagerChange; Metall:=RessChangeMet; Kristall:=RessChangeKris; Zivis:=RessChangeZivis; Soldis:=RessChangeSoldis; Lager:=LagerChange; MetKostenStr:=floattostr(RessChangeMet); KrisKostenStr:=floattostr(RessChangeKris); ZiviKostenStr:=floattostr(RessChangeZivis); SoldisKostenStr:=floattostr(RessChangeSoldis); LagerStr:=floattostr(LagerChange); MLager.Text:=MLager.Text+LagerStr+#13#10; |
also hier ist das das Memo MLager.Text ...
Muss ich da noch irgendwas einfügen, um dieses Memo aus der Unit 1 herraus verwenden kann?
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 23.01.10 23:21
Nein, so geht das nicht. Du kannst nicht die Implementation einer Klassen-Methode in eine andere Unit auslagern. Man kann zwar mit Include-Dateien arbeiten, aber das ist afaik nicht besonders empfehlenswert.
Was du machen kannst, ist so etwas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Unit Unit1;
implementation
uses UnitNeu;
procedure TForm1.Button1Click(Sender: TObject); begin MachWasLanges; end; |
Und die Prozedur MachWasLanges in eine andere Unit auslagern
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Unit UnitNeu;
interface
procedure MachwasLanges;
implementation
uses Unit1;
procedure MachWasLanges; begin With Form1 do begin end; end; |
Besonders guter Stil ist das imho auch nicht - aber ich sitze in der Hinsicht im Glaushaus und werfe mit Steinen, wenn ich das behaupte. 
_________________ We are, we were and will not be.
|
|
Xearox 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: Sa 23.01.10 23:26
jetzt Fehlt mir nur noch der Befehl "floattostr"
der wird in Unit3 als Fehler markiert: Undeklarierter Bezeichner
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 23.01.10 23:31
Die Unit, in der FloatToStr definiert ist, muss natürlich bei Unit3 mit in die Uses-Liste. Welche das ist, weiß ich nicht auswendig. SysUtils oder so was in der Richtung. 
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 23.01.10 23:36
Du solltest dein Design überdenken. Ein Zugriff aus anderen Units ist eigentlich nie notwendig, da die direkt zur Oberfläche gehörende Logik auch in die Form-Unit gehört.
Allerdings heißt das ja nicht, dass man nicht auch Teile davon auslagern kann, man muss ja nur die Komponenten mit übergeben oder mit Rückgabewerten arbeiten. Und schon hat man erstens allgemeineren Code und zweitens keine unübersichtlichen Kreuzbezüge aus aufgerufenen Funktionen heraus (bei denen man sich dann hinterher wundert, wenn man mit den Effekten daraus nicht mehr rechnet).
Ein Beispiel, nehmen wir an wir geben einen Befehl in ein Editfeld (edtCommand) ein zusammen mit einem Parameter (edtParam), werten den Befehl aus und rufen dann eine Funktion auf, die das Ergebnis dann in ein Memo (memResult) eintragen soll: FormUnit 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TfrmMain.btnStartClick(Sender: TObject); begin case GetCommandIndex(edtCommand.Text) of COMMAND_EXAMPLE: begin if ExecuteExample(edtParam.Text, memResult.Lines) then ... end; ... else memResult.Text := 'Unbekannter Befehl'; end; end; | Zweite Unit 1: 2: 3: 4: 5: 6: 7: 8:
| function ExecuteExample(AParam: String; AMsgLog: TStrings): Boolean; var Test: Integer; begin Result := TryStrToInt(AParam, Test); if Result then AMsgLog.Add('Wert erfolgreich verarbeitet: ' + IntToStr(Test)); end; | Das ist natürlich nur ein kurzes Beispiel, zeigt aber hoffe ich wie das sauber gelöst werden kann.
Und natürlich kann ggf. auch direkt die visuelle Komponente oder so übergeben werden falls nötig. Normalerweise lässt sich das aber vermeiden.
|
|
Xearox 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: So 24.01.10 00:37
okay, ich mache das erst mal so, wie ich das vorher hatte, also nicht das was jaenicke vorgeschlagen hat...
Da ich eher noch einsteiger bin, und nach und nach das Programm verändern werde...
Wie bekomme ich nun die Procedure Baukosten, welche ich in Unit3 Definiert habe, in Unit1, also damit ich diese da verwenden kann...?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 24.01.10 00:38
Es genügt die Unit in die uses zu schreiben, siehe Gausis Beispiel oben.
|
|
Xearox 
      
Beiträge: 260
Erhaltene Danke: 3
|
Verfasst: So 24.01.10 00:43
okay...ich hatte das bei dem Uses im Interface drin stehen...also da stand die Unit2 drin, die Unit3 aber nicht...
Macht das ein unterschried, ob Implemetation oder Interface?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 24.01.10 00:57
Der Unterschied ist, dass du Deklarationen aus einer Unit, die unter interface steht, bereits im interface nutzen kannst und bei einer Unit, die unter implementation steht, die Sachen daraus auch erst dort nutzen kannst. 
|
|
|