Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi wie geh ich mit units um ? (https://www.delphipraxis.net/14913-wie-geh-ich-mit-units-um.html)

dakleene 18. Jan 2004 00:18


wie geh ich mit units um ?
 
Hallo dp'ler

Units soweit ich weiss nutzt man zur u.a. auch zur auslagerung fuer z.B. seine Utility sammlung oder auch damit der source uebersichtlicher bleibt ?!
Korregiert mich bitte wenn ich damit falsch liege, ich versuche mich in sachen programmieren noch nicht allzulange, um genauer zu sein erst seit etwa ein halbes jahr.

um auf den Punkte zukommen habe ich ein komplett neues project begonnen, ich habe nun eine HauptForm mit einer dementsprechenden HauptUnit, auf die HauptForm um bei meinem beispiel zu bleiben habe ich einen Panel und einen Button gepackt.

Wenn ich diesen Button klicke möchte ich dass dynamisch aus einer weiteren Unit (ich nenne sie mal FormloseUnterUnit) ein tWebBrowser auf den Panel kreiert wird.

Bis dahin alles kein problem. Wie jedoch gehe ich dann mit ereignissen um ? Ich moechte die ereignisse nicht in meiner HauptUnit schreiben sondern auch in meine (wie ich sie vorhin genannt und auch weiterhin nun mal nenne) FormloseUnterUnit.

Delphi-Quellcode:
unit HauptUnit;

interface

uses
  ...;

type
  THauptForm = class(TForm)
    vPanel: TPanel;
    Button: TButton;
    ...
    procedure ButtonClick(Sender: TObject);
    ...
  private
  public
    meinDollerBrowser : TWebBrowser;
  end;

var
  HauptForm: THauptForm;

implementation

uses
  FormloseUnterUnit;

{$R *.DFM}

procedure THauptForm.ButtonClick(Sender: TObject);
begin
  kreierMalLos;
end;

end.
Delphi-Quellcode:
unit FormloseUnterUnit;

interface

uses
  SHDocVw;

  procedure kreierMalLos;
  procedure jauNuIsDocumentComplete(Sender: TObject;
    const pDisp: IDispatch; var URL: OleVariant);

implementation

uses
  HauptUnit;

procedure jauNuIsDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  HauptForm.Caption := 'Test erfollgreich';
end;

procedure kreierMalLos;
begin
  HauptForm.meinDollerBrowser :=TWebBrowser.Create(HauptForm.vPanel);
  HauptForm.meinDollerBrowser.Height              := 150;
  HauptForm.meinDollerBrowser.Left                := 0;
  HauptForm.meinDollerBrowser.Silent              := True;
  HauptForm.meinDollerBrowser.Top                 := 0;
  HauptForm.meinDollerBrowser.Width               := 150;
  HauptForm.vPanel.InsertControl(HauptForm.meinDollerBrowser);
  HauptForm.meinDollerBrowser.Navigate ('http://www.google.de');
  HauptForm.meinDollerBrowser.OnDocumentComplete  := jauNuIsDocumentComplete; // hier liegt mein Problem
  { mit der Fehlermeldung kann ich leider auch nix anfangen }
end;

end.
Hab ich etwas vergessen, wenn ja was oder habe ich fehler gemacht ?

Minz 18. Jan 2004 01:30

Re: wie geh ich mit units um ?
 
Wo liegt das Problem genau?

im OnClick-Ereignis rufst du die Prozedur/Funktion aus deiner FormlosenUnterunit auf. Das sieht doch ok aus!

Damit du die zweite unit verwenden kannst musst du sie in der Hauptunit natürlich einbinden.

uses FormloseUnterUnit;

dakleene 18. Jan 2004 01:42

Re: Wo liegt das Problem genau?
 
Dass habe ich selbstverstaendlich auch gemacht, dass problem liegt darin dass ich in meiner FormlosenUnit kein ereigniss schreiben kann, oehmn,... schreiben wohl schon, jedoch bekomme ich beim kompilieren in der letzten zeile
Code:
  HauptForm.meinDollerBrowser.OnDocumentComplete  := jauNuIsDocumentComplete; // hier liegt mein Problem
die fehlermeldung
'Inkompatible Typen: Methodenzeiger und regulaere Procedure'

F1 gibt vollgendes aus
Zitat:

Der Compiler hat einen Unterschied zwischen der Deklaration und der Verwendung einer Prozedur entdeckt.

program Produce;

type
ProcedureParm0 = procedure; stdcall;
ProcedureParm1 = procedure(var x : Integer);

procedure WrongConvention; register;
begin
end;

procedure WrongParms(x, y, z : Integer);
begin
end;

procedure TakesParm0(p : ProcedureParm0);
begin
end;

procedure TakesParm1(p : ProcedureParm1);
begin

end;

begin
TakesParm0(WrongConvention);
TakesParm1(WrongParms);
end.

Der Aufruf von TakesParm0 löst einen Fehler aus, weil der Typ ProcedureParm0 eine Prozedur stdcall erwartet, während WrongConvention mit der Aufrufkonvention register deklariert wurde. Außerdem wird der Aufruf von TakesParm1 fehlschlagen, weil die Parameterlisten nicht übereinstimmen.

program Solve;

type
ProcedureParm0 = procedure; stdcall;
ProcedureParm1 = procedure(var x : Integer);

procedure RightConvention; stdcall;
begin
end;

procedure RightParms(var x : Integer);
begin
end;

procedure TakesParm0(p : ProcedureParm0);
begin
end;

procedure TakesParm1(p : ProcedureParm1);

begin
end;

begin
TakesParm0(RightConvention);
TakesParm1(RightParms);
end.

Die Lösung für beide Probleme liegt einfach darin, darauf zu achten, daß die Aufrufkonvention bzw. die Parameterlisten mit der Deklaration übereinstimmen.
damit kann ich als anfaenger leider nicht wirklich etwas anfangen.

SirThornberry 18. Jan 2004 09:52

Re: wie geh ich mit units um ?
 
pack das ganze einfach in eine Klasse und schon sollte es gehen (also das formloseunit)

dakleene 18. Jan 2004 14:05

Re: wie geh ich mit units um ?
 
Oke dann weiss ich nun genauer wo mein Problem liegt!

Wie mach ich dass ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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