Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   kann man alle wichtigen Funktionen auslagern ? (https://www.delphipraxis.net/84233-kann-man-alle-wichtigen-funktionen-auslagern.html)

LingNeu 13. Jan 2007 17:41


kann man alle wichtigen Funktionen auslagern ?
 
Hallo Delphifans,
ist es möglich, die verschiedenen, selbstgeschriebenen Funktionen in einer eigenen Datei unterzubringen?
Habe schon mal in einem Buch gewälzt, da steht aber nichts drin, ausser das man in Units sowas machen kann, leider kein Beispiel.
Gibt es noch eine andere Möglichkeit, seinen Code etwas zu strukturieren.
In der Zwischenzeit hat mein Programm (eine Unit) über 3000 Zeilen und ich wollte einige Funktionen und Proceduren auslagern.
Leider krieg ich das nicht hin - ohne ein Bombardement von Fehlern.
Das Programm funktioniert ja, aber ich bin halt ein bischen ein Perfektionist und da würde ich gerne, die Sache etwas verbessern.
Vielleicht hat einer von euch Profis einen guten Tipp für mich.
Wäre wirklich sehr dankbar für einen Hinweis oder ein kleines Beispiel.
vielen Dank und schöne Grüsse
LingNeu

mkinzler 13. Jan 2007 17:57

Re: kann man alle wichtigen Funktionen auslagern ?
 
Einfach Funktionen in eiegene Unit auslagern und diese dann unter Uses einbinden.
Mit welchen Fehlern wist du bombardiert?

Martin K 13. Jan 2007 18:06

Re: kann man alle wichtigen Funktionen auslagern ?
 
Unit ist genau das richtige Stichwort.
Mal ein Beispiel, wie Du die Prozeduren Test1, Test2 und den Typ TTest in eine Unit schreibst (Name der Unit musst Du noch selbst festlegen, heißt hier als Beispiel: NameDeinerUnit):
Delphi-Quellcode:
unit NameDeinerUnit;

interface

uses
  //alle Units die für diese Unit gebraucht werden

type
  TTest = ...
    ...
  end;

procedure Test1(...);
procedure Test2(...);

implementation

//ggf. kommt hier noch was von TTest hin

procedure Test1(...);
begin
  //hier der Code
end;

procedure Test2(...);
begin
  //hier der Code
end;

end.
Diese Unit (Dateiname: NameDeinerUnit.pas) muss dann in das aktuelle Verzeichnis (wo das Projekt ist, in dem du die Unit nutzen willst), oder in das Verzeichnis C:\Programme\Borland\<DelphiVersion>\Lib, falls du diese Unit in Zukunft immer zur Verfügung haben möchtest, für mehrere Projekte.

Um diese Unit dann in deinem aktuellen Projekt nutzen zu können, musst du sie bei deinem Projekt (dort in der Unit, in der die andere Unit verwendet werden soll) unter uses auflisten, etwa so:
Delphi-Quellcode:
unit Unit1;

interface

uses
  {hier steht schon einiges}, NameDeinerUnit;

{...}
Grüße, Martin

LingNeu 13. Jan 2007 18:17

Re: kann man alle wichtigen Funktionen auslagern ?
 
@mkinzler
Es kommt immer "undefinierter Bezeichner: Dauer"

Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//rest
label3.Caption := Dauer(now);
end;

Delphi-Quellcode:
unit Unit2;

interface
function Dauer(ADate: TDateTime): string;

implementation

function Dauer(ADate: TDateTime): string;
//rest
end;

C.Schoch 13. Jan 2007 19:06

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hi,
Du die Unit2 hier einschreiben
Delphi-Quellcode:
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2; // <-- Hier

LingNeu 13. Jan 2007 19:57

Re: kann man alle wichtigen Funktionen auslagern ?
 
@C.Schoch
danke für Deinen Hinweis. Ich habe unter den uses die Unit2 reingesetzt. Jetzt geht die Sache. Kann man noch was machen, weil noch eine Unbekannte Funktion angemahnt wurde.
Die war in der Funktion Dauer (DecodeDate)
Erst als ich die Zeile Uses mit den Angaben von der Unit1 reingesetzt habe, funktionierte die Sache richtig.
Mein Frage wäre, wie kann ich feststellen, welche uses-Eintragung ich brauche, da ich momentan alle von der Unit1 eingefügt habe. Vermutlich ist die DecodeDate in der SysUtils drin.
Gibt es keine Möglichkeit auf diese Angaben zu verzichten, damit es trotzdem funktiont, auch wenn nur in der Unit1 die Angaben sind. Jetzt sind sozusagen in beiden Units unter uses die gleichen Eintragungen - ist das richtig ?
Besten Dank nochmals

Delphi-Quellcode:
unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
function Dauer(ADate: TDateTime): string;

implementation

function Dauer(ADate: TDateTime): string;
//rest z.B. DecodeDate()
end;

Klaus01 13. Jan 2007 19:59

Re: kann man alle wichtigen Funktionen auslagern ?
 
Du solltest die Unit SysUtils in Dein Unit2 einbinden.
Dann brauchst Du nicht die Unit1 in die Unit2 einbinden.

Grüße
Klaus

Nils_13 13. Jan 2007 21:04

Re: kann man alle wichtigen Funktionen auslagern ?
 
Zu der Uses-Klausel in der eigenen Unit noch ein kleiner Tipp: Wenn du wirklich nicht weißt, in welcher Unit die gesuchte Prozedur oder Funktion steht, kannst du einfach alle Units eines Standardprojekts (solange sie in den Standardunits mit Sicherheit enthalten sind, da muss man halt schauen) in deine Unit reinschreiben (uses-Klausel) und dann knall einfach wieder die nicht benötigten Units raus.

Christoph Frank 20. Mär 2007 11:41

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hallo zusammen,

zu diesem Thema habe ich auch noch eine Frage.
In meiner Anwendung habe ich ein Formular mit unterschiedlichen Komponenten Edit, Button usw. In Abhängigkeit der Verarbeitung müssen die Komponenten enabeld oder disabled werden. Diese Routinen blähen mein Main ziemlich auf und ich möchte sie in eine eigene unit auslagern, wegen der Übersicht.
Wie kann ich in dieser unit die in der Form1 festgelgten Komponenten ansprechen?
Also:
In der Unit1 von Form1 befindet sich ein Edit1-Feld.
In MeinUnit ist die procedure InaktivMachen in der ich Edit1.Enabled := false; setzen möchte.
MeinUnit kennt natürlich das Edit1-Feld aus Form1-Unit1 nicht und da liegt mein Problem.

Für baldige Hilfe bin ich sehr dankbar.

Matze 20. Mär 2007 11:44

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hi,

du musst lediglich in den uses ein Formular (hier: Form1) einbinden und kannst dann mit

Delphi-Quellcode:
Form1.Edit.Enabled := true;
darauf zugreifen.

DP-Maintenance 20. Mär 2007 11:44

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi.

Blackheart 20. Mär 2007 11:46

Re: kann man alle wichtigen Funktionen auslagern ?
 
Form1.Edit1 und wenn Du viele Komponenten hast die Enabled werden sollen schau Dir mal FindComponent an vieleicht hilft Dir das.

Phoenix 20. Mär 2007 11:47

Re: kann man alle wichtigen Funktionen auslagern ?
 
Eigentlich gehört genau dieser Code (Handling vom Userinterface) auf das Form. Und nur dahin. Und eigentlich auch nur dieser Code. Businesslogik gehört hingegen genau nicht aufs Form. Also würde ich eher diese Auslagern.

Christoph Frank 21. Mär 2007 09:45

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hallo Matze,

ich hatte vergessen zu sagen, daß ich das schon versucht hatte, leider aber die Fehlermeldung bekam, daß die Datei Form1.DCU nicht gefunden werden kann. Auf meinem ganzen PC befindet sich diese geforderte Datei nicht !!
Habe ich vielleicht falsche Bibliothekseinstellungen oder Compiler-Options?
Gruß Christoph

mkinzler 21. Mär 2007 09:47

Re: kann man alle wichtigen Funktionen auslagern ?
 
Zitat:

daß die Datei Form1.DCU nicht gefunden werden kann. Auf meinem ganzen PC befindet sich diese geforderte Datei nicht !!
Aber vielleicht Form1.PAS!
BTW. Die Bezeichnung Form1 ist sehr (un-)sinnig.

DP-Maintenance 21. Mär 2007 10:25

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

Christoph Frank 21. Mär 2007 10:37

Re: kann man alle wichtigen Funktionen auslagern ?
 
Nein Form1.pas ist nicht vorhanden. Beim Speichern habe ich CAF0012 vor die Namen und das Projekt gestellt mein Verzeichnis sieht wie folgt aus:


Datentr„ger in Laufwerk C: hat keine Bezeichnung
Seriennummer des Datentr„gers: 0A58-13F7
Verzeichnis von C:\Programme\Borland\Delphi5\Projects\CAF0001

. <DIR> 15.03.07 11:54 .
.. <DIR> 15.03.07 11:54 ..
CAF000~1 DOF 1.258 20.03.07 10:12 CAF0012Project1.dof
CAF000~1 PAS 15.200 20.03.07 12:13 CAF0012Unit1.pas
CAF000~1 DFM 5.418 20.03.07 12:42 CAF0012Unit1.dfm
CAF000~1 DPR 498 20.03.07 10:12 CAF0012Project1.dpr
CAF000~1 CFG 544 20.03.07 10:12 CAF0012Project1.cfg
CAF000~1 RES 876 17.03.07 14:00 CAF0012Project1.res
CAF000~1 ~PA 15.553 20.03.07 10:13 CAF0012Unit1.~pas
CAF000~1 ~DF 5.418 20.03.07 9:32 CAF0012Unit1.~dfm
CAF000~2 PAS 492 15.03.07 13:09 CAF0012Unit2.pas
CAF000~2 DFM 1.767 15.03.07 13:00 CAF0012Unit2.dfm
CAF000~1 ~DP 461 17.03.07 13:09 CAF0012Project1.~dpr
CAF000~3 PAS 3.645 20.03.07 12:17 CAF0012Unit3.pas
CAF000~3 DFM 3.468 19.03.07 16:17 CAF0012Unit3.dfm
CAF000~2 ~PA 3.998 20.03.07 10:30 CAF0012Unit3.~pas
CAF000~2 ~DF 3.468 19.03.07 16:17 CAF0012Unit3.~dfm
CAF000~4 PAS 1.362 20.03.07 12:20 CAF0012Upro.pas
CAF000~3 ~PA 611 20.03.07 10:36 CAF0012Upro.~pas
17 Datei(en) 64.037 Bytes
2 Verzeichnis(se) 8.214,97 MB frei

Christoph Frank 21. Mär 2007 10:54

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hallo zusammen, bitte nicht mehr weitersuchen, ich bin ja blö...
Wenn ich selbst den Namen ändere muß ich auch den geänderten Namen für die Form angeben.
Vielen Dank für Eure Unterstützung.
Christoph

raiguen 21. Mär 2007 11:25

Re: kann man alle wichtigen Funktionen auslagern ?
 
Zitat:

Zitat von Christoph Frank
In der Unit1 von Form1 befindet sich ein Edit1-Feld.
In MeinUnit ist die procedure InaktivMachen in der ich Edit1.Enabled := false; setzen möchte.
MeinUnit kennt natürlich das Edit1-Feld aus Form1-Unit1 nicht und da liegt mein Problem.
...

Wenn du eine allgemein gültige Prozedure haben möchtest,dann so in etwa:
Delphi-Quellcode:
procedure TMeinUnit.InaktivMachen(aEdit: TEdit);
begin
  aEdit.Enabled := not aEdit.Enabled; //--nur als Beispiel
end;
//-- Aufruf aus JEDER x-beliebigen Form mit
   InaktivMachen(Edit1);
DAS hier:
Zitat:

Zitat von Matze
Hi,

du musst lediglich in den uses ein Formular (hier: Form1) einbinden und kannst dann mit

Delphi-Quellcode:
Form1.Edit.Enabled := true;
darauf zugreifen.

kannst du getrost vergessen! Warum? Wenn du eine allgemeingültige Unit schreiben willst, dann wäre es aus meiner Sicht absoluter Blödsinn, sämtliche 'Quell'Units alá Form1, FormXYZ in dies uses-Klausel reinzuschreiben! Was passiertr wohl, wenn du ein neues Projekt hast und deine allgemein gültige Unit mit einbindest? KLaro-> der Compiler meckert die nicht gefundenden Units in der uses-KLausel an :roll:
Anderes Beispiel, wo du Unit-übergreifend (um das mal so zu nennen) MeinUnit einsetzen kannst:
Delphi-Quellcode:
{geht zur nächsten Control, wenn ENTER gedrückt wurde}
{--Aufruf bspw. im EditKeyPress: p_TabOnEnter(Self,Key) ->Self ist autom. die Form auf der sich das Edit befindet}
procedure p_TabOnEnter(const AForm: TForm; var AKey: Char);
begin
  if AKey = #13 then
    if AForm <> nil then
      begin
        AForm.Perform(WM_NextDlgCtl, 0, 0);
        AKey := #0;
  end;
end;

Christoph Frank 21. Mär 2007 12:58

Re: kann man alle wichtigen Funktionen auslagern ?
 
Hallo zusammen,
nun hatte ich schon fast gedacht eine gute Routine für die Betätigung der Entertaste zu erhalten. Es ist schon geraume Zeit her, als ich mich mit diesem Thema beschäftigt habe.
Mein damaliges Problem war:
Immer dann, wenn ich aus einem EditField in das nächste mit 'Enter' wollte gibt es einen System-Beep.
Um den Anwender nicht zu verwirren sollte dieser Beep nicht auftreten. Ich habe alles mögliche probiert, doch den Beep konnte ich nicht verhindern.
Hat denn da jemand eine Lösung?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz