![]() |
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:
|
Re: Funktion aus Unit1 in Unit3 benutzen
in die unit3 schreiben:
Delphi-Quellcode:
voila, fertig :-D
uses
{ ... }, Unit1; mfG mirage228 |
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; |
Re: Funktion aus Unit1 in Unit3 benutzen
Steht die Funktionsdeklaration von GetLevel im Interface-Teil der Unit1?
|
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? |
Re: Funktion aus Unit1 in Unit3 benutzen
Stehen die "uses unit1" bzw. "uses unit3" jeweils im interface-Teil? Kreuzreferenz?
|
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.
|
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?)
|
Re: Funktion aus Unit1 in Unit3 benutzen
Warum zweimal ist an anderer Stelle nachzulesen. Kannst du die beiden Units posten?
|
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. |
Re: Funktion aus Unit1 in Unit3 benutzen
In Unit1:
Wenn du
Code:
im interface-Teil von TForm1 deklariert, muss auch im implementation-Teil stehen:
function GetLevel(nick: string): string;
Code:
Es fehlt das
function TForm1.GetLevel(nick: string): string;
Code:
TForm1
|
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? |
Re: Funktion aus Unit1 in Unit3 benutzen
hoi, danke für die antwort, ..hmm, ich bekomme aber jetzt wieder nen fehler O_o
Zitat:
|
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? |
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..." |
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