Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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...

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:

ausblenden 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
  // ganz furchtbar langer und unübersichtlicher Code
end;
*)


//Ändern zu
procedure TForm1.Button1Click(Sender: TObject);
begin
  MachWasLanges;  
end;


Und die Prozedur MachWasLanges in eine andere Unit auslagern
ausblenden 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
     // langer umständlicher Code, der früher in Button1Click war
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Sa 23.01.10 23:26 
jetzt Fehlt mir nur noch der Befehl "floattostr"
der wird in Unit3 als Fehler markiert: Undeklarierter Bezeichner
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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;
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 24.01.10 00:38 
Es genügt die Unit in die uses zu schreiben, siehe user profile iconGausis Beispiel oben.
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :idea: