Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aufruf ohne bestimmten Namen (https://www.delphipraxis.net/85874-aufruf-ohne-bestimmten-namen.html)

fr0g 6. Feb 2007 10:58


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:
for i:=0 to 50 do begin
 form[i].MsgBox:=TFicMessageBox.Create(self);
 form[i].MsgBox.Name:='icY'+IntToStr(i);
end;
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]:
Delphi-Quellcode:
if(...)and(...)then
  mhistory.Lines.Add(Fhaupt.evstext.Text);
end;
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.
Delphi-Quellcode:
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;
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:
Delphi-Quellcode:
mhistory.Lines.Add(Fhaupt.evstext.Text);
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!

Lange Rede kurzer Sinn. Hoffe es kann mir jemand helfen.
mfg fr0g

marabu 6. Feb 2007 11:13

Re: Aufruf ohne bestimmten Namen
 
Hallo,

von welchem Ereignis wird denn der Text an das Memo angefügt?

Delphi-Quellcode:
if(...)and(...)then
  mhistory.Lines.Add(Fhaupt.evstext.Text);
end;
Grüße vom marabu

hoika 6. Feb 2007 11:23

Re: Aufruf ohne bestimmten Namen
 
Hallo,

FindComponent benutzen

Bsp:
Delphi-Quellcode:
var
  Memo: TMemo;
begin
  Memo:= TMemo(FindComponent('Memo_2'));

usw.
Wer Lust hat, darf auch vorher noch auf NIL prüfen ....

Heiko

marabu 6. Feb 2007 11:29

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;

fr0g 6. Feb 2007 11:57

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

fr0g 6. Feb 2007 12:38

Re: Aufruf ohne bestimmten Namen
 
Ich veröffentliche einfach mal den Quellcode bis jetzt (grob):

Hauptform: FicYou
Delphi-Quellcode:
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.
MessageForm: FicMessageBox
Delphi-Quellcode:
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.
Hoffe das mir jetzt jemand helfen kann!!! :(

marabu 6. Feb 2007 13:15

Re: Aufruf ohne bestimmten Namen
 
Hallo,

du legst Formulare in einem Array ab:

Delphi-Quellcode:
form: array [1..255] of FormList;

// ...

for i := 0 to 50 do
begin
  form[i].MsgBox := TFicMessageBox.Create(self);
Deine Schleife beginnt bei Index 0, aber dein Array soielt erst ab Index 1 richtig mit.

Freundliche Grüße

yörsch 6. Feb 2007 13:22

Re: Aufruf ohne bestimmten Namen
 
Zitat:

Zitat von marabu
Delphi-Quellcode:
form: array [1..255] of FormList;
// ...
for i := 0 to 50 do
begin
  form[i].MsgBox := TFicMessageBox.Create(self);
Deine Schleife beginnt bei Index 0, aber dein Array soielt erst ab Index 1 richtig mit.

sollte das nicht zu einem Laufzeitfehler führen oder hab ich dawas überlesen :gruebel:
Oder Gibt´s ne´ Option wo man das ausschalten kann?

fr0g 6. Feb 2007 13:44

Re: Aufruf ohne bestimmten Namen
 
Funzt trotzdem nicht. Hab immernoch eine Zugriffsverletzung!


Verdammt nochmal..... :gruebel: :gruebel: :gruebel:

Klaus01 6. Feb 2007 13:48

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 13:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz