![]() |
Programmteile in extra Unit auslagern
Hallo Leute, habe eine Frage bzgl. Unit - Einbindung.
Ich bin dabei ein Programm zu schreiben, bei dem vom Hauptformular aus auch noch weitere Formulare zur Laufzeit erzeugt werden können und Parameter zwischen diesen Fenstern übergeben werden. So weit so gut, das geht auch. ABER: Ich habe es bisher nicht geschafft, einen Programmteil in eine Unit ohne Formular auszulagern. (Der Sinn und Zweck einen Programmteil auszulagern soll einfach darin liegen, dass ich Quelltext aus dem Hauptunit rausbekomme um Übersicht im Programm zu schaffen.) Ich scheitere aber immer daran, dass in der ausgelagerten Unit die Komponenten des Hauptformulars und/oder auch die Variablen des Hauptformulars nicht definiert sind. Also hab ich mir versucht in der OH anzuschauen, wo und wie ich die Variablen deklarieren muss, damit das "gesamte Programm" die Variablen kennt. Da stolpert man über den Interface Abschnitt oder über den Public Abschnitt. Habe 1. die Unit_extern in der Uses-Klausel in der Unit1 eingebunden 2. die Unit1 in der Unit_extern eingebunden 3. Variablen die Global sein sollen in Unit1 unter Public deklariert Trotzdem geht´s net. :wall: |
Re: Programmteile in extra Unit auslagern
Delphi-Quellcode:
oder
Unit.Variablenname
Delphi-Quellcode:
... :zwinker:
Form.Variablenname
|
Re: Programmteile in extra Unit auslagern
Hi
Delphi-Quellcode:
Dann Aufruf z.B.:
unit uMain;
{$I myDebug.pas} interface uses Windows, Messages, Dialogs, SysUtils, Forms, StdCtrls, Classes, Controls, ExtCtrls, StShlCtl, SRChkBox, ovcbase, ovcmeter, LEDPaint, dynForm; type TMain = class(TForm) ...... end; var Main : TMain; SavCursor : TCursor; implementation {$R *.dfm} uses uUtil; <=== das brauchst Du !!!
Delphi-Quellcode:
Willst Du in der ausgelagerten Unit auf Variablen von Main zugreifen, musst Du entweder die Main-Unit in der ausgelagerten als "uses" deklarieren, oder mit
uUtil.Demo := true;
uUtil.machwas(SavCursor);
Delphi-Quellcode:
arbeiten und die Werte "public" übergeben und zurückholen.
procedure test (var value : irgendwas);
|
Re: Programmteile in extra Unit auslagern
Hi padavan,
wenn du Quellcode aus einer Formular-Unit in eine Extra-Unit auslagerst, dort aber wieder auf Formular-Komponenten aus der ersten Unit zugreifen mußt......dann stimmt irgendwas mit deinem Konzept nicht. Übersichtlicher wird dadurch gar nichts und du bekommst auch noch zirkuläre Referenzen (was zwar compilierbar ist, solange nicht in beiden Units im Interface, aber unsauber). Außerdem ist es dann mit sauberer Objektorientierung vorbei, sobald du nämlich mehr als eine Instanz deines Formulars hast, geht das Ganze in die Hose. Stattdessen würde ich in die Extra-Unit nur allgemeine Routinen auslagern und entsprechend Variablen im Prozedurkopf deklarieren. also statt
Delphi-Quellcode:
lieber
procedure DoIt;
begin MyMainForm.ListBox.Add(.....); end;
Delphi-Quellcode:
procedure DoIt(aListBox: TListBox);
begin aListBox.Add(.....); end; Roderich |
Re: Programmteile in extra Unit auslagern
Wenn du nur Funktionen/Prozeduren hast, dann kanst du die doch einfach in eine Unit auslagern, die bindest du dann hier ein:
Delphi-Quellcode:
Vorteil: Du kannst aber auch häufig verwendete Funktionen da mit einbinden, die du normalerweise selbst immer neu hättest coden müssen ;-)
interface
uses Windows, Messages, ..., DeineUnit; |
Re: Programmteile in extra Unit auslagern
Hallo Roderich,
naja, es ging mir eigentlich darum Quellcode aus der Hauptform rauszunehmen, nicht aus zusätzlichen Formularen, die sind ja dann schon extra und "sauber", allerdings triffts DymonD recht gut mit seinem Vorschlag. Genauso in der Art hätte ich mir das vorgestellt. Eine Procedure welche sehr Textintensiv ist einfach aus der Unit1 rausnehmen --> aus übersichtlichkeit eben. Diese Variante werde ich gleich mal versuchen umzusetzten... Vielen Dank für jede Hilfe!!! |
Re: Programmteile in extra Unit auslagern
Hmm, muss noch mal nerven,
habe jetzt die Procedure in eine andere Unit ausgelagert
Delphi-Quellcode:
und diese Unit folgendermaßen deklariert
unit Unit_Sprache;
interface implementation var Variablename: integer; begin // Anweisung...... end; end.
Delphi-Quellcode:
Aber wie spreche ich nun diese procedure in der ausgelagerten Unit an?
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, inifiles, StdCtrls, ExtCtrls, Unit_Sprache; Habe es mit Unit_Sprache.? "und genau das hängts schon" versucht. :gruebel: Bin für jede Hilfe dankbar. Padavan |
Re: Programmteile in extra Unit auslagern
Du musst das wie jede "normale" Prozedur auch deklarieren:
Delphi-Quellcode:
Das Ganze aufrufen dann mit
procedure Addiere(zahl1, zahl2: integer): integer;
begin // Mache was... end;
Delphi-Quellcode:
Eigentlich einfach :mrgreen:
c := Addiere(a, b);
Das ist ja in dem Moment genauso, wie
Delphi-Quellcode:
Diese Prozedur ist ja nicht anders definiert ;-)
StrToInt(Edit2.Text);
|
Re: Programmteile in extra Unit auslagern
Delphi-Quellcode:
Zwischen der Variablenvereinbarung "Variablenname" und dem "Begin End" muß "procedure" stehen,
unit Unit_Sprache;
interface implementation var Variablename: integer; begin // Anweisung...... end; end. so hier:
Delphi-Quellcode:
schöni
var Variablename: integer;
PROCEDURE DeineProzedur; begin // Anweisung...... Variablenname := 1; end; |
Re: Programmteile in extra Unit auslagern
So langsam bin ich depremiert, scheinbar habe ich noch irgendwie ein Verständnisproblem.
Wenn ich die "externe" Unit in die Unit1 einbinde (und das habe ich jeweils im Interface sowohl als auch im Implementation Abschnitt versucht), dann bin ich trotzdem nicht in der Lage, eine Procedure in der "externen" Unit aufzurufen. Habe die Korrektur von schöni auch schon mit drin. Dennoch meckert Delphi beim Übersetzen, da es die Procedure von der externen Unit in der Unit1 nicht kennt. Die Variablen aus der Unit1 sind allerdings in der externen Unit bekannt, das klappt wenigstens schonmal. Was allerdings auch nocht nicht funktioniert ist, wenn ich in der externen Unit auf Komponenten des Hauptformulars zugreifen will, dass er diese dann auch wieder nicht kennt. :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 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 by Thomas Breitkreuz