Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zugriff auf Prozedur anderer Unit (https://www.delphipraxis.net/79823-zugriff-auf-prozedur-anderer-unit.html)

tankm26 29. Okt 2006 10:28


Zugriff auf Prozedur anderer Unit
 
Moin!

Den ZUgrifdf aus meiner 1.Unit, skat1, auf eine procedure der 2.unit, xmod, bekome ich nicht hin. Woran kann das liegen?

Danke im Voraus,

Wieland
Delphi-Quellcode:
unit skat1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ScktComp, StdCtrls, Grids, ExtCtrls, ImgList,
  ActnList, ComCtrls, jpeg, Buttons, xmod;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    btnormals: TButton;
    btnachkrbub: TButton;
    btgeben: TButton;
    btende: TButton;
    btsort2: TButton;
    btsort3: TButton;
    btmischen: TButton;
    lsort2: TLabel;
    lsort3: TLabel;
    lsort1: TLabel;
    Label1: TLabel;
    btmemory: TButton;
    btrestore: TButton;
    btsort4: TButton;
    lsort4: TLabel;
    lbox: TListBox;
    ledi1: TLabeledEdit;
    btneumax: TBitBtn;
    lmax: TLabel;
    Image1: TImage;
    trbr: TTrackBar;
    lmodi: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure btnormalsClick(Sender: TObject);
    procedure btnachkrbubClick(Sender: TObject);
    procedure btendeClick(Sender: TObject);
    procedure btgebenClick(Sender: TObject);
    procedure btsort2Click(Sender: TObject);
    procedure btsort3Click(Sender: TObject);
    procedure btmischenClick(Sender: TObject);
    procedure btmemoryClick(Sender: TObject);
    procedure btrestoreClick(Sender: TObject);
    procedure btsort4Click(Sender: TObject);
    procedure btneumaxClick(Sender: TObject);
    procedure trbrChange(Sender: TObject);
  private
    procedure zeitmessung(w,s:integer);
    procedure wimageload;
    procedure wsortiere1vert(s,w:integer);
    procedure wsortiere2einf;
    procedure wsortiere3ausw;
    procedure wsortiere4adrian;
    procedure wmischen;
    procedure wgeben;
    procedure change;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  karten:array[1..33] of TBitmap;
  kartenfeld,memory1:array[1..32] of Integer;
  nummern:array[1..33]of Integer;
  nix,von,bis,max,ws:integer;
  c,n1,n2,q:int64;
implementation
{$R *.dfm}

.
.
.


procedure TForm1.change;
var i:integer;
begin

.
.
.

   // xmod.TForm2.   HIER IST MEIN PROBLEM
  end;
end;
end.


Unit 2 (xmod):


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ScktComp, StdCtrls, Grids, ExtCtrls, ImgList,
  ActnList, ComCtrls, jpeg, Buttons;
 
type
  TForm2 = class(TForm)
  procedure wxgeben;
  end;

  var
  zahlenfeld, memory2: array of Integer;

implementation
uses skat1;

procedure tform2.wxgeben;
var i:Integer;
begin
 for i:=1 to 30 do
  form1.lbox.Items.Add(IntToStr(i));
end;

end.

DocE 29. Okt 2006 10:32

Re: Zugriff auf Prozedur anderer Unit
 
Der Aufruf muss in der Form:

Delphi-Quellcode:
Form2.wxgeben;
erfolgen.


Grüsse
...Doc

mkinzler 29. Okt 2006 10:33

Re: Zugriff auf Prozedur anderer Unit
 
Zeig mal dei 2. Unit.

DocE 29. Okt 2006 10:39

Re: Zugriff auf Prozedur anderer Unit
 
Die steht doch oben mit drin :wink:

mkinzler 29. Okt 2006 10:44

Re: Zugriff auf Prozedur anderer Unit
 
Zitat:

Zitat von DocE
Die steht doch oben mit drin :wink:

hab ich übersehen, da sie an die erste Unit angehängt war.

tankm26 29. Okt 2006 10:46

Re: Zugriff auf Prozedur anderer Unit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Aufruf "Form2.wxgeben;" funktioniert leider nicht.


Ich habe das Programm mal angehängt.

DocE 29. Okt 2006 10:51

Re: Zugriff auf Prozedur anderer Unit
 
Das Problem ist, dass es sich gar nicht um ein "normales" Formular handelt, sondern um eine Unit, in der Du ein TForm2 typisierst, dieses allerdings nie erzeugst.

Benötigst Du ein zweites Formular oder nur eine weitere Unit (zur besseren Übersichtlichkeit)?

Dann muss/sollte das ganze ein bißchen anders aussehen...


Grüsse
...Doc

tankm26 29. Okt 2006 10:54

Re: Zugriff auf Prozedur anderer Unit
 
nur ne neue unit

DocE 29. Okt 2006 10:57

Re: Zugriff auf Prozedur anderer Unit
 
Dann probiers mal so:

Delphi-Quellcode:
unit xmod;

interface

uses
  Windows, SysUtils;

  procedure wxgeben;


var
  zahlenfeld, memory2: array of Integer;

implementation

uses skat1;


procedure wxgeben;
var i: Integer;
begin

  for i:=1 to 30 do
    form1.lbox.Items.Add(IntToStr(i));

end;

end.
Aufruf aus Form1 heraus durch

Delphi-Quellcode:
wxgeben; // oder auch: xmod.wxgeben; (beides möglich)
Edit: Natürlich die Unit in Form1 einbinden...


Grüsse
...Doc

tankm26 29. Okt 2006 11:00

Re: Zugriff auf Prozedur anderer Unit
 
funzt, danke

tankm26 30. Okt 2006 09:28

Re: Zugriff auf Prozedur anderer Unit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann jemand von euch erkennen, wieso die listbox auf dem 2. panel nicht mehr sichtbar ist, sobald das panel angezeigt wird?

Delphi-Quellcode:
unit skat1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ScktComp, StdCtrls, Grids, ExtCtrls, ImgList,
  ActnList, ComCtrls, jpeg, Buttons;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    lsort2: TLabel;
    lsort3: TLabel;
    lsort1: TLabel;
    lsort4: TLabel;
    Image1: TImage;
    lmodi: TLabel;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    btnormals: TButton;
    btnachkrbub: TButton;
    btgeben: TButton;
    btende: TButton;
    btsort2: TButton;
    btsort3: TButton;
    btmischen: TButton;
    btmemory: TButton;
    btrestore: TButton;
    btsort4: TButton;
    ledi1: TLabeledEdit;
    btneumax: TBitBtn;
    trbr: TTrackBar;
    Panel2: TPanel;
    lbox: TListBox;
    ximage1: TImage;
    xbtmischen: TButton;
    xbtgeben: TButton;
    xbtmemory: TButton;
    xbtrestore: TButton;
    xbtnormals: TButton;
    xbtsort2: TButton;
    xbtsort3: TButton;
    xbtsort4: TButton;
    xlsort1: TLabel;
    xlsort3: TLabel;
    xlsort4: TLabel;
    xlsort2: TLabel;
    xbtende: TButton;
    xtrbr: TTrackBar;
    xlmodi: TLabel;
    xlabel2: TLabel;
    xbtneumax: TBitBtn;
    xledi1: TLabeledEdit;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure btnormalsClick(Sender: TObject);
    procedure btnachkrbubClick(Sender: TObject);
    procedure btendeClick(Sender: TObject);
    procedure btgebenClick(Sender: TObject);
    procedure btsort2Click(Sender: TObject);
    procedure btsort3Click(Sender: TObject);
    procedure btmischenClick(Sender: TObject);
    procedure btmemoryClick(Sender: TObject);
    procedure btrestoreClick(Sender: TObject);
    procedure btsort4Click(Sender: TObject);
    procedure btneumaxClick(Sender: TObject);
    procedure trbrChange(Sender: TObject);
  private
    procedure zeitmessung(w,s:integer);
    procedure wimageload;
    procedure wsortiere1vert(s,w:integer);
    procedure wsortiere2einf;
    procedure wsortiere3ausw;
    procedure wsortiere4adrian;
    procedure wmischen;
    procedure wgeben;
    procedure change;
    procedure wxgeben;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  karten:array[1..33] of TBitmap;
  kartenfeld,memory1:array[1..32] of Integer;
  nummern:array[1..33]of Integer;
  nix,von,bis,max,ws:integer;
  c,n1,n2,q:int64;
implementation
{$R *.dfm}

procedure TForm1.zeitmessung(w,s:integer);
begin
  if w=0 then begin      //Start
    QueryPerformanceFrequency(c);
    QueryPerformanceCounter(n1);
 end;
 if w=1 then begin    //Stop
  QueryPerformanceCounter(n2);
  if s=1 then lsort1.Caption:=format('Zeit: %g s',[(n2-n1)/c]);
  if s=2 then lsort2.Caption:=format('Zeit: %g s',[(n2-n1)/c]);
  if s=3 then lsort3.Caption:=format('Zeit: %g s',[(n2-n1)/c]);
  if s=4 then lsort4.Caption:=format('Zeit: %g s',[(n2-n1)/c]);
 end;
 if w=2 then begin //Reset

 end;
end;

procedure TForm1.wmischen;
var i,x,j:integer;
 begin
 Randomize;
  for i:=1 to max do begin
    j:=Random(max-1)+1;
    X:=kartenfeld[i];
    kartenfeld[i]:=kartenfeld[j];
    kartenfeld[j]:=x;
  end;
  stringgrid1.Refresh;
end;

procedure TForm1.wgeben;
var i:integer;
begin
  for i:=1 to max do
    kartenfeld[i]:=nummern[i];
  nix:=nummern[33];
end;



procedure TForm1.wsortiere1vert(s,w:integer);
var i,x,j:integer;
begin
  zeitmessung(0,1);
  if s=0 then begin
    i:=1;
    repeat
    for j:=i+1 to max do begin
      if kartenfeld[j] < kartenfeld[i] then begin
        x:=kartenfeld[i];
        kartenfeld[i]:=kartenfeld[j];
        kartenfeld[j]:=x;
      end;
    end;
  i:=i+1;
  until i=max;
end;
  if s=1 then begin
  x:=1;
  repeat
    if kartenfeld[x]=w then begin
      kartenfeld[x]:=kartenfeld[x+1];
      kartenfeld[x+1]:=w;
    end;
    x:=x+1;
  until x=max;
  end;
stringgrid1.Refresh;
zeitmessung(1,1);
end;

procedure TForm1.wsortiere2einf;
  {man vergleicht die 1. karte mit allen folgenden, dann die 2. mit allen anderen usw. wäre adrian}
{ [url]http://www.gymmelk.ac.at/nus/Delphi/Delphi11.htm#auswahl[/url]  }
var
i,j,x:integer;
begin
  zeitmessung(0,2);
  for i:=2 to max do begin
    x:=kartenfeld[i];
    j:=i-1;
    while (x<kartenfeld[j]) and (j>0) do begin
      kartenfeld[j+1]:=kartenfeld[j];
      dec(j);
    end;
    kartenfeld[j+1]:=x;
  end;
  stringgrid1.Refresh;
  zeitmessung(1,2);
end;

procedure TForm1.wsortiere3ausw;
var d,e,f,g:integer;
begin
  zeitmessung(0,3);
  for f:=1 to max-1 do begin
    e:=0;
    g:=f;
    for d:=f+1 to max do begin
      if kartenfeld[d]<g then begin
        g:=kartenfeld[d];
        e:=d;
      end;
    end;
    kartenfeld[e]:=kartenfeld[f];
    kartenfeld[f]:=g;
  end;
  stringgrid1.Refresh;
  zeitmessung(1,3);
end;

procedure TForm1.wsortiere4adrian;
var i,j,z:integer;
begin
  zeitmessung(0,4);
  for i:=1 to max-1 do
  begin
    for j:=i+1 to max do
    begin
      if kartenfeld[j]<kartenfeld[i] then
      begin
      z:=kartenfeld[i];
      kartenfeld[i]:=kartenfeld[j];
      kartenfeld[j]:=z;
      end;
    end;
  end;
  stringgrid1.Refresh;
  zeitmessung(1,4);
end;

procedure TForm1.wimageload;
var i: integer;
begin
  for i:=1 to 33 do
  begin
    karten[i]:=TBitmap.Create;
    karten[i].LoadFromFile(IntToStr(i)+'.bmp');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var ws:integer;
begin
  wimageload;
  for ws:=1 to 33 do nummern[ws]:=ws;
  for ws:=1 to 32 do kartenfeld[ws]:=nummern[33];
  stringgrid1.Refresh;
  max:=32;
  form1.Width:=1019;
  form1.Height:=347;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var c:integer;
begin
  for c:=1 to 32 do begin
    if kartenfeld[Acol+1]=c then
    stringgrid1.Canvas.Draw(rect.left, rect.top, Karten[c]);
  end;
end;

procedure TForm1.btnormalsClick(Sender: TObject);
begin
  wsortiere1vert(0,0);
end;

procedure TForm1.btnachkrbubClick(Sender: TObject);
begin
  wsortiere1vert(1,29);
  wsortiere1vert(1,21);
  wsortiere1vert(1,13);
  wsortiere1vert(1,5);
end;

procedure TForm1.btendeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.btgebenClick(Sender: TObject);
begin
  wgeben;
  stringgrid1.Refresh;
  btnachkrbub.Enabled:=true;
  btnormals.Enabled:=true;
  btsort2.Enabled:=true;
  btsort3.Enabled:=true;
  btsort4.Enabled:=true;
  btmischen.Enabled:=true;
  btmemory.Enabled:=true;
  btrestore.Enabled:=true;
end;

procedure TForm1.btsort2Click(Sender: TObject);
begin
 wsortiere2einf;
end;

procedure TForm1.btsort3Click(Sender: TObject);
begin
  wsortiere3ausw;
  wsortiere3ausw;
end;

procedure TForm1.btmischenClick(Sender: TObject);
begin
wmischen;
end;

procedure TForm1.btmemoryClick(Sender: TObject);
var w:integer;
begin
  for w:=1 to 32 do begin
    memory1[w]:=kartenfeld[w];
  end;
  stringgrid1.Refresh;
end;

procedure TForm1.btrestoreClick(Sender: TObject);
var w:integer;
begin
  for w:=1 to 32 do begin
    kartenfeld[w]:=memory1[w];
  end;
  stringgrid1.Refresh;
end;

procedure TForm1.btsort4Click(Sender: TObject);
begin
  wsortiere4adrian;
end;

procedure TForm1.btneumaxClick(Sender: TObject);
begin
  if panel1.Visible=true then begin
    if StrToInt(ledi1.Text)>32 then begin
    showmessage('Für den Skatmodus bitte nur max. 32');
    ledi1.Text:='32';
    end else begin
      max:=StrToInt(ledi1.Text);
      wxgeben;
    end;
  end else begin
    max:=StrToInt(ledi1.Text);
    wxgeben;
  end;
end;

procedure TForm1.trbrChange(Sender: TObject);
begin
  if not panel1.Visible=true then begin
    //Skatmodus
    change;
    ws:=0;
  end else
  begin
    //X-Modus
    change;
    ws:=1;
  end;
end;

procedure TForm1.change;
begin
  if ws=0 then begin
    //skatmodus
    form1.Width:=1020;
    form1.Height:=348;
    panel1.Visible:=true;
    panel2.Visible:=false;
    trbr.Position:=0;
  end else begin
    //x-modus
    form1.Width:=378+9;
    form1.Height:=600+36;
    panel1.Visible:=false;
    panel2.Visible:=true;
    panel2.Left:=0;
    panel2.Top:=0;
    trbr.Position:=1;
  end;
end;

procedure TForm1.wxgeben;
var i: Integer;
begin
  lbox.clear;
  for i:=1 to max do lbox.Items.Add(IntToStr (i));
end;

end.

DocE 30. Okt 2006 09:46

Re: Zugriff auf Prozedur anderer Unit
 
Ja, weil die Eigenschaft Visible auf FALSE steht (wenn Du die rote Listbox meinst).

Grüsse
...Doc

tankm26 30. Okt 2006 09:58

Re: Zugriff auf Prozedur anderer Unit
 
:? selten dämlich!


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