![]() |
Aufruf ohne bestimmten Namen
Guten Tag
Tut mir erstmal Leid das mir kein besserer Titel eingefallen ist. Denn ich habe folgendes Problem. Ich erstelle in meinem Programm eine bestimmt Anzahl von Formblättern aus einem vordefinierten herraus. Also:
Delphi-Quellcode:
In dieser Form befindet sich ein Memo-Feld. In dieses soll jetzt nach einer bestimmten Vereinbarung ein Text hinzugefügt werden. Aber nur speziell dnan in Formblatt 1 oder 2 ... Nur wenn ich dann vom Programm aus schreibe [ist im jeweiligen n-ten Formblatt]:
for i:=0 to 50 do begin
form[i].MsgBox:=TFicMessageBox.Create(self); form[i].MsgBox.Name:='icY'+IntToStr(i); end;
Delphi-Quellcode:
Dann fügt er aber in jedes erstellte Formblatt den Text und nicht nur in dem speziellen. Also müsste ich Für jedes Formblatt auch noch den Namen des Memo-Feldes ändern.
if(...)and(...)then
mhistory.Lines.Add(Fhaupt.evstext.Text); end;
Delphi-Quellcode:
So. Das ist ja auch alles gut und schön. Aber wie ist denn jetzt der Befehl dafür das er auf die Memo-Felder zugreift? Weil mit:
for i:=0 to 50 do begin
form[i].MsgBox:=TFicMessageBox.Create(self); form[i].MsgBox.Name:='icY'+IntToStr(i); form[i].MsgBox.mhistory.Name:='mhistory'+IntToStr(i); end;
Delphi-Quellcode:
kann ich ja nicht arbeiten weil der Name ja nicht mehr stimmt. Und ne Variable im Aufruf geht ja auch nicht. Oder? <- Und das ist meine Frage!
mhistory.Lines.Add(Fhaupt.evstext.Text);
Lange Rede kurzer Sinn. Hoffe es kann mir jemand helfen. mfg fr0g |
Re: Aufruf ohne bestimmten Namen
Hallo,
von welchem Ereignis wird denn der Text an das Memo angefügt?
Delphi-Quellcode:
Grüße vom marabu
if(...)and(...)then
mhistory.Lines.Add(Fhaupt.evstext.Text); end; |
Re: Aufruf ohne bestimmten Namen
Hallo,
FindComponent benutzen Bsp:
Delphi-Quellcode:
Wer Lust hat, darf auch vorher noch auf NIL prüfen ....
var
Memo: TMemo; begin Memo:= TMemo(FindComponent('Memo_2')); usw. Heiko |
Re: Aufruf ohne bestimmten Namen
Ich ahne Schlimmes: Fhaupt ist wahrscheinlich die globale Form-Variable - weg damit:
Delphi-Quellcode:
if(...)and(...)then
mhistory.Lines.Add(evstext.Text); end; |
Re: Aufruf ohne bestimmten Namen
erstens: Ich hab den Befehl in dem Formblatt das so oft kopiert wird.
zweitens: Mit dme FindComponent hat erstmal gut geklappt. Nur da gibts jetzt noch ein Problem. Der gibt mir immer eine Fehlermeldung mit einer Zugriffsverletzung. Also der Text erscheint im Formblatt und dann kommen die Zugriffsverletzungen (mehrere!). drittens: was? Fhaupt ist meine Standart Formblatt. Dann hab ich noch ein zweites Formblatt gemacht. Und dieses wird dann 51mal erstellt. Was soll denn stattdessen hin? :?: Jemand eine Idee? Bin auch fleißig am überlegen. mfg fr0g |
Re: Aufruf ohne bestimmten Namen
Ich veröffentliche einfach mal den Quellcode bis jetzt (grob):
Hauptform: FicYou
Delphi-Quellcode:
MessageForm: FicMessageBox
unit ustart;
interface uses Windows, Messages, ..., mmsystem, Menus, ShellAPI, uicmessage, jpeg; type TFicyou = class(TForm) ips: TMemo; lrechner: TLabel; ... bbenutzer: TImage; procedure FormCreate(Sender: TObject); procedure TCPServerExecute(AThread: TIdPeerThread); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure BenutzerlisteDblClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure closeClick(Sender: TObject); private { Private-Deklarationen } public procedure serverstarten; procedure serverstoppen; procedure formsvorladen; { Public-Deklarationen } end; type FormList=record MsgBox:TFicMessageBox; end; var Ficyou: TFicyou; form:array [1..255] of FormList; implementation {$R *.dfm} procedure pause(zeit:LongInt); VAR anfang:LongInt; begin anfang:=GetTickCount; while GetTickCount<anfang+zeit do Application.ProcessMessages; end; procedure TFicyou.FormCreate(Sender: TObject); begin self.BorderIcons:=[biSystemMenu,biMinimize]; TCPServer.Active:=True; end; procedure TFicyou.FormActivate(Sender: TObject); VAR i:integer; begin serverstarten; for i:=0 to 50 do begin form[i].MsgBox:=TFicMessageBox.Create(self); form[i].MsgBox.Name:='icY'+IntToStr(i); form[i].MsgBox.mhistory.Name:='mhistory'+IntToStr(i); formsvorladen; SndPlaySound('Sounds/Startup.wav', SND_ASYNC ); end; procedure TFicyou.TCPServerExecute(AThread: TIdPeerThread); VAR Eintrag,msg:integer; MsgBySvr:String; begin try MsgBySvr:=AThread.Connection.ReadLn(#$A,5500); // Clientnachricht lesen eabsenderip.Text:=AThread.Connection.Socket.Binding.PeerIP; Eintrag:=lbips.Items.IndexOf(eabsenderip.Text); if Eintrag>=0 then begin Benutzerliste.ItemIndex:=Eintrag; MsgBySvr:=Benutzerliste.Items.Strings[Eintrag]+': '+MsgBySvr; end else begin SndPlaySound('Sounds/Auth.wav', SND_ASYNC); msg:=MessageDlg('Sie wurden von einem Benutzer (IP: '+eabsenderip.Text+') angeschrieben. Wollen sie diesen Benutzer zu ihrer Kontaktliste hinzufügen? (Achtung!: Erst nach dem Hinzufügen ist es möglich Nachrichten von Usern zu bekommen d.h. Sie müßten in jetzt anschreiben!)',mtinformation,[mbyes,mbno],0); if msg=mryes then begin FicUser.leip.Text:=eabsenderip.Text; FicUser.Show; eabsenderip.Text:=''; end; if msg=mrno then eabsenderip.Text:=''; end; except AThread.Connection.Disconnect; end; evstext.Text:=MsgBySvr; if (form[Eintrag].MsgBox.Visible=false) then begin SndPlaySound('Sounds/Message.wav', SND_ASYNC); form[Eintrag].MsgBox.Visible:=true; end; pause(221); eabsenderip.Text:=''; evstext.Text:=''; end; procedure TFicyou.FormClose(Sender: TObject; var Action: TCloseAction); begin serverstoppen; end; procedure TFicyou.BenutzerlisteDblClick(Sender: TObject); begin form[Benutzerliste.ItemIndex].MsgBox.Visible:=true; form[Benutzerliste.ItemIndex].MsgBox.Show; end; procedure TFicyou.serverstarten; begin TcpServer.Active:=false; TcpServer.Bindings.Clear; TcpServer.DefaultPort:=StrToIntDef('4466',4466); try TcpServer.Active:=true; except raise; end; if TcpServer.Active then begin lstatus.caption:='Verbindung hergestellt'; lstatus.Font.Color:=clGreen; end; end; procedure TFicyou.serverstoppen; begin try TcpServer.Active:=false; except raise; end; if not TcpServer.Active then begin lstatus.caption:='Verbindung unterbrochen'; lstatus.Font.Color:=clMaroon; end; end; procedure TFicYou.formsvorladen; VAR i:integer; begin for i:=0 to Benutzerliste.Items.Count-1 do begin form[i].MsgBox.Show; form[i].MsgBox.Visible:=false; pause(20); end; end; end.
Delphi-Quellcode:
Hoffe das mir jetzt jemand helfen kann!!! :(
unit uicmessage;
interface uses Windows, ... ,Menus; type TFicmessageBox = class(TForm) bsenden: TButton; TCPClient: TIdTCPClient; IdAntiFreeze2: TIdAntiFreeze; Nachrichtsuche: TTimer; bsmilie: TButton; mhistory: TMemo; mmessage: TMemo; procedure bsendenClick(Sender: TObject); procedure NachrichtsucheTimer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure mmessageChange(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FicmessageBox: TFicmessageBox; senderuser:string; lastid:integer; implementation uses ustart; {$R *.dfm} Function GetWordOfAnsiString(Text : string; WordPos : Word): string; var p : PChar; begin p := PChar(Text); repeat Dec(WordPos); while p^ <> #89 do begin if WordPos = 0 then Result := Result + p^; Inc(p); end; if WordPos = 0 then Exit; Inc(p); until p^ = #89; end; procedure pause(zeit:LongInt); VAR anfang:LongInt; begin anfang:=GetTickCount; while GetTickCount<anfang+zeit do Application.ProcessMessages; end; procedure TFicmessageBox.bsendenClick(Sender: TObject); var Msg4Svr:string; // Nachricht für den Server begin FicYou.serverstoppen; // Verbindung zum Server herstellen TcpClient.Host:=senderuser; TcpClient.Port:=StrToIntDef('4466',4466); // Versuchen eine Verbindung zum Server herzustellen try TcpClient.Connect(5000); // max. 5 Sek. um die Verbindung zum Server herzustellen except MessageDlg(senderuser+' ist offline!',mtError,[mbok],0); FicYou.serverstarten;exit; end; if TcpClient.Connected then begin Msg4Svr:=mmessage.Lines.Text; TMemo(FindComponent('mhistory'+IntToStr(lastid))).Lines.Add('Du: '+Msg4Svr); mmessage.Lines.Text:=''; // Nachricht zum Server schicken TcpClient.WriteLn(Msg4Svr); SndPlaySound('Sounds/MsgSent.wav', SND_ASYNC ); end; TCPClient.Disconnect; FicYou.serverstarten; end; procedure TFicmessageBox.NachrichtsucheTimer(Sender: TObject); begin if senderuser<>'' then begin if(FicYou.evstext.Text<>'')and(FicYou.eabsenderip.Text=senderuser)then TMemo(FindComponent('mhistory'+IntToStr(lastid))).Lines.Add(FicYou.evstext.Text) end; end; procedure TFicmessageBox.FormCreate(Sender: TObject); begin self.BorderIcons:=[biSystemMenu,biMinimize]; end; procedure TFicmessageBox.FormClose(Sender: TObject; var Action: TCloseAction); begin mmessage.Text:=''; self.Deactivate; end; procedure TFicmessageBox.FormActivate(Sender: TObject); VAR Owner : HWnd; begin Owner:=GetWindow(Handle,GW_OWNER); ShowWindow(Owner,SW_SHOW); SetWindowLong(Handle, GWL_ExStyle, WS_Ex_AppWindow); ShowWindow(Owner,SW_HIDE); lastid:=StrToInt(GetWordOfAnsiString(self.Name,2)); self.Caption:='< '+FicYou.Benutzerliste.Items.Strings[lastid]+' > - Nachrichtenfenster'; senderuser:=FicYou.lbips.Items.Strings[lastid]; if(FicYou.evstext.Text<>'')and(FicYou.eabsenderip.Text=senderuser)then TMemo(FindComponent('mhistory'+IntToStr(lastid))).Lines.Add(FicYou.evstext.Text); end; end. |
Re: Aufruf ohne bestimmten Namen
Hallo,
du legst Formulare in einem Array ab:
Delphi-Quellcode:
Deine Schleife beginnt bei Index 0, aber dein Array soielt erst ab Index 1 richtig mit.
form: array [1..255] of FormList;
// ... for i := 0 to 50 do begin form[i].MsgBox := TFicMessageBox.Create(self); Freundliche Grüße |
Re: Aufruf ohne bestimmten Namen
Zitat:
Oder Gibt´s ne´ Option wo man das ausschalten kann? |
Re: Aufruf ohne bestimmten Namen
Funzt trotzdem nicht. Hab immernoch eine Zugriffsverletzung!
Verdammt nochmal..... :gruebel: :gruebel: :gruebel: |
Re: Aufruf ohne bestimmten Namen
Hast Du schon einmal daran gedacht Haltepunkte zu setzten und mit F8 oder F7 schrittweise
durch Deinen Code zu wandern und Dir dabei relevante Variable anschaust? Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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