AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufruf ohne bestimmten Namen

Ein Thema von fr0g · begonnen am 6. Feb 2007 · letzter Beitrag vom 6. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
fr0g

Registriert seit: 11. Dez 2006
28 Beiträge
 
#1

Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 10:58
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:
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 11:13
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 11:23
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
Heiko
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 11:29
Ich ahne Schlimmes: Fhaupt ist wahrscheinlich die globale Form-Variable - weg damit:

Delphi-Quellcode:
if(...)and(...)then
  mhistory.Lines.Add(evstext.Text);
end;
  Mit Zitat antworten Zitat
fr0g

Registriert seit: 11. Dez 2006
28 Beiträge
 
#5

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 11:57
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
  Mit Zitat antworten Zitat
fr0g

Registriert seit: 11. Dez 2006
28 Beiträge
 
#6

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 12:38
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!!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 13:15
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
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#8

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 13:22
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
Oder Gibt´s ne´ Option wo man das ausschalten kann?
Jörg
have FUN
  Mit Zitat antworten Zitat
fr0g

Registriert seit: 11. Dez 2006
28 Beiträge
 
#9

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 13:44
Funzt trotzdem nicht. Hab immernoch eine Zugriffsverletzung!


Verdammt nochmal.....
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Aufruf ohne bestimmten Namen

  Alt 6. Feb 2007, 13:48
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
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.
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