Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion aus Unit1 in Unit3 benutzen (https://www.delphipraxis.net/12688-funktion-aus-unit1-unit3-benutzen.html)

Pseudemys Nelsoni 2. Dez 2003 14:19


Funktion aus Unit1 in Unit3 benutzen
 
Moin,

ich habe die unit1 in der die funktion ist in meiner unit3 eingebunden, wenn ich die funktion in der unit 3 verwenden möchte bekomme ich aber trotzdem

Zitat:

[Fehler] Unit3.pas(97): Undefinierter Bezeichner: 'GetLevel'
[Fataler Fehler] Unit1.pas(74): Verwendete Unit 'Unit3.pas' kann nicht compiliert werden
weiss jemond warum?

mirage228 2. Dez 2003 14:22

Re: Funktion aus Unit1 in Unit3 benutzen
 
in die unit3 schreiben:

Delphi-Quellcode:
uses
  { ... }, Unit1;
voila, fertig :-D

mfG
mirage228

Pseudemys Nelsoni 2. Dez 2003 14:25

Re: Funktion aus Unit1 in Unit3 benutzen
 
unit1 ist in unit3 und unit3 in unit1, deswegen weiss ich nicht wieso das nicht geht :\

unit1 sieht so aus:

uses Unit3, Unit2;


unit3 sieht so aus:

uses Unit1;

Wormid 2. Dez 2003 14:27

Re: Funktion aus Unit1 in Unit3 benutzen
 
Steht die Funktionsdeklaration von GetLevel im Interface-Teil der Unit1?

Pseudemys Nelsoni 2. Dez 2003 14:35

Re: Funktion aus Unit1 in Unit3 benutzen
 
jo, bei den ganzen anderen proceduren die automatisch hinzugefügt werden...also ganz oben unter "type"

ist das falsch?

andianon 2. Dez 2003 14:39

Re: Funktion aus Unit1 in Unit3 benutzen
 
Stehen die "uses unit1" bzw. "uses unit3" jeweils im interface-Teil? Kreuzreferenz?

Thunderchild 2. Dez 2003 14:40

Re: Funktion aus Unit1 in Unit3 benutzen
 
Die automatisch erzeugten Prozeduren dürfen nicht in Private stehen. Wenn dem so ist, verschiebe sie nach public.

Pseudemys Nelsoni 2. Dez 2003 14:42

Re: Funktion aus Unit1 in Unit3 benutzen
 
ich weiss nicht ganz wie das gemeint ist, aber ich habe 2 uses (wie immer) in meinen units, und die units die ich eingebunden habe sind beim 2ten "uses"(warum gibts den teil überhaupt 2mal?)

andianon 2. Dez 2003 14:45

Re: Funktion aus Unit1 in Unit3 benutzen
 
Warum zweimal ist an anderer Stelle nachzulesen. Kannst du die beiden Units posten?

Pseudemys Nelsoni 2. Dez 2003 14:53

Re: Funktion aus Unit1 in Unit3 benutzen
 
klar, wird zwar bisschen viel aber .... :angle2:


also das ist unit1 derzeit:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ToolWin, ComCtrls, StdCtrls, XPMan, ImgList, IdBaseComponent,
  IdAntiFreezeBase, IdAntiFreeze, IdComponent, IdTCPConnection,
  IdTCPClient, IdIRC, ExtCtrls, Mask, Menus;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    XPManifest1: TXPManifest;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    GroupBox2: TGroupBox;
    ListView1: TListView;
    ToolButton6: TToolButton;
    ImageList1: TImageList;
    GroupBox3: TGroupBox;
    ListBox1: TListBox;
    GroupBox4: TGroupBox;
    ListView2: TListView;
    GroupBox5: TGroupBox;
    StatusBar1: TStatusBar;
    IdAntiFreeze1: TIdAntiFreeze;
    IdIRC1: TIdIRC;
    Memo1: TMemo;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    PopupMenu1: TPopupMenu;
    V1: TMenuItem;
    N1: TMenuItem;
    Quiz1: TMenuItem;
    Antwort1: TMenuItem;
    procedure ToolButton6Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure IdIRC1Notice(Sender: TObject; AUser: TIdIRCUser;
      AChannel: TIdIRCChannel; Content: String);
    procedure IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
      AContent: String; var Suppress: Boolean);
    procedure IdIRC1UserMode(Sender: TObject; AModes: String);
    procedure IdIRC1Message(Sender: TObject; AUser: TIdIRCUser;
      AChannel: TIdIRCChannel; Content: String);
    procedure IdIRC1Quit(Sender: TObject; AUser: TIdIRCUser);
    procedure IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
      AChannel: TIdIRCChannel);
    procedure IdIRC1Parted(Sender: TObject; AChannel: TIdIRCChannel);
    procedure IdIRC1Join(Sender: TObject; AUser: TIdIRCUser;
      AChannel: TIdIRCChannel);
    procedure ToolButton4Click(Sender: TObject);
    procedure IdIRC1Kick(Sender: TObject; AUser, AVictim: TIdIRCUser;
      AChannel: TIdIRCChannel);
    procedure IdIRC1Kicked(Sender: TObject; AUser: TIdIRCUser;
      AChannel: TIdIRCChannel);
    function GetLevel(nick: string): string;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  benutzer: TStringList;

implementation

uses Unit3, Unit2;

{$R *.dfm}

function GetLevel(nick: string): string;
var
  i: integer;
  match: boolean;
  nilist, lilist: string;
begin
  match := false;
  for i := 0 to Form3.Memo1.Lines.Count-1 do
  begin
    nilist := Copy(Form3.Memo1.Lines.Strings[i], 1, Pos(':', Form3.Memo1.Lines.Strings[i])-1);
    lilist := Copy(Form3.Memo1.Lines.Strings[i], Pos(':', Form3.Memo1.Lines.Strings[i])+1, length(Form3.Memo1.Lines.Strings[i]));
    if nick = nilist then
    begin
      Result := nick + #9 + '[' + lilist + ']';
      match := true;
      break;
    end;
  end;
  if match = false then
  begin
    Result := nick + #9 + '[0]';
  end;
end;




procedure TForm1.ToolButton6Click(Sender: TObject);
begin
  Form3.ShowModal;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  if ToolButton1.Hint = 'Verbinden' then
  begin
    ToolButton1.Hint := 'Trennen';
    ToolButton1.ImageIndex := 2;
    idIRC1.Connect;
  end
  else
  begin
    ToolButton1.Hint := 'Verbinden';
    ToolButton1.ImageIndex := 0;
    idIRC1.Disconnect;
  end;
end;

procedure TForm1.IdIRC1Notice(Sender: TObject; AUser: TIdIRCUser;
  AChannel: TIdIRCChannel; Content: String);
begin
  if auser.Nick = 'NickServ' then
  begin
    if Content = 'If you do not change within one minute, I will change your nick.' then
    begin
      idirc1.Say('NickServ', 'identify ...');
    end;
    if Content = 'NickServ Your nick isn''t registered.' then
    begin
      idirc1.Say('NickServ', 'register ... ism' + IntToStr(Random(999999)));
      idirc1.Say('NickServ', 'link ism ...');
      idirc1.Join('#night');
    end;
    if Content = 'Password accepted - you are now recognized.' then
    begin
      idirc1.Join('#night');
    end;
  end;
end;




procedure GetNicks(AUser: TIdIRCUser; ACommand, AContent: string);
begin
  Delete(AContent, 1, Pos(':', AContent));
  benutzer := TStringList.Create;
  while Pos(' ', AContent) > 0 do
  begin
    case AContent[1] of
      '*' : Delete(AContent, 1, 1);
      '!' : Delete(AContent, 1, 1);
      '@' : Delete(AContent, 1, 1);
      '%' : Delete(AContent, 1, 1);
      '+' : Delete(AContent, 1, 1);
    end;
    benutzer.Sorted := true;
    benutzer.Add(Copy(AContent, 1, Pos(' ', AContent)-1));
    Delete(AContent, 1, Pos(' ', AContent));
  end;
end;

procedure EndOfNicks(AUser: TIdIRCUser; ACommand, AContent: string);
var
  i: integer;
begin
  for i := 0 to benutzer.Count-1 do
  Form1.ListBox1.Items.Add(GetLevel(benutzer.Strings[i]));
  benutzer.free;
end;






procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
  AContent: String; var Suppress: Boolean);
begin
  if ACommand = '353' then GetNicks(AUser, ACommand, AContent);
  if ACommand = '366' then EndOfNicks(AUser, ACommand, AContent);
end;


procedure TForm1.IdIRC1UserMode(Sender: TObject; AModes: String);
begin
  idIRC1.Say('NickServ', 'identify ...');
end;

procedure TForm1.IdIRC1Message(Sender: TObject; AUser: TIdIRCUser;
  AChannel: TIdIRCChannel; Content: String);
begin
  Memo1.Lines.Add('[' + DateToStr(Now) + '][' + TimeToStr(Now) + '] (' + auser.Nick + ') ' + Content);
end;

procedure TForm1.IdIRC1Quit(Sender: TObject; AUser: TIdIRCUser);
begin
  if auser.Nick <> idirc1.Nick then
  ListBox1.Items.Delete(ListBox1.Items.IndexOf(GetLevel(auser.Nick)))
  else ListBox1.Clear;
end;

procedure TForm1.IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
  AChannel: TIdIRCChannel);
begin
  ListBox1.Items.Delete(ListBox1.Items.IndexOf(GetLevel(auser.Nick)));
end;

procedure TForm1.IdIRC1Parted(Sender: TObject; AChannel: TIdIRCChannel);
begin
  ListBox1.Clear;
  memo1.Clear;
end;

procedure TForm1.IdIRC1Join(Sender: TObject; AUser: TIdIRCUser;
  AChannel: TIdIRCChannel);
begin
  ListBox1.Items.Add(GetLevel(auser.nick));
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

procedure TForm1.IdIRC1Kick(Sender: TObject; AUser, AVictim: TIdIRCUser;
  AChannel: TIdIRCChannel);
begin
  ListBox1.Items.Delete(ListBox1.Items.IndexOf(GetLevel(auser.Nick)));
end;

procedure TForm1.IdIRC1Kicked(Sender: TObject; AUser: TIdIRCUser;
  AChannel: TIdIRCChannel);
begin
  ListBox1.Clear;
  memo1.Clear;
end;

end.

das ist unit3:

Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, registry;

type
  TForm3 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

uses Unit1;

{$R *.dfm}

function CountTok(c: char; s: string): integer;
begin
  Result := 0;
  while Pos(c, s) > 0 do
  begin
    inc(Result);
    Delete(s, 1, Pos(c, s));
  end;
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
 Close;
end;

procedure TForm3.Button2Click(Sender: TObject);
var
  reg: TRegistry;
  i, i2: integer;
  match: boolean;
  cnick, nilist: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CURRENT_USER;
    OpenKey('Software\GCC\ism v2.0', true);
    WriteString('userlist', '');
    for i := 0 to Memo1.Lines.Count-1 do
    begin
      WriteString('userlist', ReadString('userlist') + Memo1.Lines.Strings[i] + ';');
    end;
    CloseKey;
    Free;
  end;
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CURRENT_USER;
    OpenKey('Software\GCC\ism v2.0', true);
    WriteString('banlist', '');
    for i := 0 to Memo2.Lines.Count-1 do
    begin
      WriteString('banlist', ReadString('banlist') + Memo2.Lines.Strings[i] + ';');
    end;
    CloseKey;
    Free;
  end;
  for i := 0 to Form3.Memo1.Lines.Count-1 do
  begin
    match := false;
    for i2 := 0 to Form1.ListBox1.Items.Count-1 do
    begin
      nilist := Copy(Memo1.Lines.Strings[i], 1, Pos(':', Memo1.Lines.Strings[i])-1);
      cnick := Copy(Form1.ListBox1.Items.Strings[i2], 1, Pos(#9, Form1.ListBox1.Items.Strings[i2])-1);
      if cnick = nilist then
      begin
        Form1.ListBox1.Items.Delete(i2);
        Form1.ListBox1.Items.Add(GetLevel(cnick)); // <<< hier der fehler von wegen undefinierte bezeichner
        break;
      end;
    end;
  end;
  Close;
end;

procedure TForm3.FormCreate(Sender: TObject);
var
  reg: TRegistry;
  cKey: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CURRENT_USER;
    OpenKey('Software\GCC\ism v2.0', true);
    cKey := ReadString('userlist');
    while CountTok(';', cKey) > 1 do
    begin
      Memo1.Lines.Add(Copy(cKey, 1, Pos(';', cKey)-1));
      Delete(cKey, 1, Pos(';', cKey));
    end;
    if (Pos(';', cKey) > 0) AND (length(cKey) > 2) then
    Memo1.Lines.Add(Copy(cKey, 1, Pos(';', cKey)-1));
    CloseKey;
    Free;
  end;
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CURRENT_USER;
    OpenKey('Software\GCC\ism v2.0', true);
    cKey := ReadString('banlist');
    while CountTok(';', cKey) > 1 do
    begin
      Memo2.Lines.Add(Copy(cKey, 1, Pos(';', cKey)-1));
      Delete(cKey, 1, Pos(';', cKey));
    end;
    if (Pos(';', cKey) > 0) AND (length(cKey) > 2) then
    Memo2.Lines.Add(Copy(cKey, 1, Pos(';', cKey)-1));
    CloseKey;
    Free;
  end;
end;

end.

andianon 2. Dez 2003 15:02

Re: Funktion aus Unit1 in Unit3 benutzen
 
In Unit1:

Wenn du
Code:
function GetLevel(nick: string): string;
im interface-Teil von TForm1 deklariert, muss auch im implementation-Teil stehen:

Code:
function TForm1.GetLevel(nick: string): string;
Es fehlt das
Code:
TForm1

andianon 2. Dez 2003 15:10

Re: Funktion aus Unit1 in Unit3 benutzen
 
Jetzt kurz zum interface und implementation Teil:

Grob gesagt stehen im Interface-Teil einer Unit die Deklarationen(Bekanntmachungen) von Klassen, Methode, Veriablen, Konstanten usw., die eine andere Unit verwenden können soll.
Im Implementation-Teil steht dann der entsprechende Code zu der Deklaration.

An deinem Beispiel:

Du hast GetLevel als Methode der Klasse TForm1 im Interface-Teil deklariert und muss dann dafür sorgen, dass im Implementation Teil der entsprechende Code dazu steht TForm1.GetLevel usw...

Greifst du jetzt von Form3 aus auf Unit1.Form1.GetLevel zu, geht das nur, weil die Klasse TForm3 im Interface Teil von Unit1 die Klasse TForm1 mit der Methode GetLevel findet.

Reicht in Kurzform?

Pseudemys Nelsoni 2. Dez 2003 15:19

Re: Funktion aus Unit1 in Unit3 benutzen
 
hoi, danke für die antwort, ..hmm, ich bekomme aber jetzt wieder nen fehler O_o

Zitat:

[Fehler] Unit1.pas(61): Ungenügende Forward- oder External-Deklaration: 'TForm1.GetLevel'
[Fataler Fehler] Project1.dpr(9): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
(edit): hab deine letzte nachricht noch nicht gelesen, ich tu das mal schnell ^^

Pseudemys Nelsoni 2. Dez 2003 15:26

Re: Funktion aus Unit1 in Unit3 benutzen
 
ah, es funktioniert.

danke nochmal für die extra nachhilfe :)

btw: kann ich meine function nicht auch ohne "TForm1...."benennen?

andianon 2. Dez 2003 15:27

Re: Funktion aus Unit1 in Unit3 benutzen
 
Im interface-Teil von Unit1 ist eine Klasse definiert, die TForm1 heißt. In dieser Klasse ist eine Methode GetLevel deklariert (hier gehört natürlich kein TForm1 davor).
Im implementation-Teil von Unit1 stand die Methode GetLevel ohne das davorgehörige TForm1.

Anleitung:
- In Unit1: setzte im implementation-Teil ein "TForm1" vor "GetLevel..." ---> "function TForm1.GetLevel..."

andianon 2. Dez 2003 15:29

Re: Funktion aus Unit1 in Unit3 benutzen
 
Letztes Post war dann wohl überflüssig. Natürlich kannst du das TForm1 weglassen, aber wenn du möchtest, dass GetLevel zu TForm1 gehört, dann schreib es gefälligst davor, denn sonst funzt es nicht.


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