AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Form2 soll auf das ClientSocket von Form1 zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Form2 soll auf das ClientSocket von Form1 zugreifen

Ein Thema von sk0r · begonnen am 10. Jun 2007 · letzter Beitrag vom 11. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#1

Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 04:49
Tag.

Ich mache gerade ein Programm mit mehreren Forms.
In Form1 habe ich ein ClientSocket. Nun muss aber
Form2 auch darauf zugreifen können, um etwas ins
Internet zu senden. Ich habe eine extra Funktion
geschrieben, welche ich in der Klassendefinition
von Form1 in den public Bereich gemacht habe.
Ich kann aber leider nicht darauf zugreifen,
weil ich ja zu erst die Unit von Form1 inkludieren
muss. Das geht aber nicht, da Form1 die Form2 schon
inkludiert und es so zu einem Fehler kommt.
Die Form1 muss die Form2 inkludieren, da sie die
Form per Button anzeigt.

Meine Frage: Gibt es irgendeinen Weg, dass ich von Form2 auf das
ClientSocket der Form1 zugreifen kann? Bitte um Hilfe!!

Danke im Vorraus!

MfG: sk0r
  Mit Zitat antworten Zitat
marabu

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

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 09:05
Guten Morgen.

Forms sind in erster Linie Bausteine der Benutzeroberfläche. Sobald du eine Überkreuznutzung entdeckst, gibt es ein einfaches Hilfsmittel: Verlagere die nicht-visuelle Komponente in eine eigene Unit, die du dann in die Uses-Klauseln der betroffenen Forms aufnimmst.

Sollte dieser Ansatz einmal nicht möglich sein, dann gibt es die hier vereinfachte Regel, die dennoch helfen kann: Überkreuznutzung ist möglich, wenn die Units nicht beide in der Uses-Klausel des interface Abschnitts aufgeführt werden. Siehe dazu OH - Uses-Klausel - Zirkuläre Referenzen.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 10:03
da form2 nach form1 erstellt wird fände ich es am sinnvollsten das du TForm2 von TForm1 aus kreierst und der TForm2-Instanz den Clientsocket übergibst. Alles andere (zum Beispiel TForm2 greift auf die Instanz Form1 zu) ist keine sauber Objektorientierung weil auf bestimmte Instanzvariablen zu gegriffen wird und ein mehrfach erzeugen der Forms dann nicht fehlerfrei funktioniert.
Delphi-Quellcode:
TForm2 = class(TForm)
[...]
private
  fSocket: TClientSocket;
public
  property Clientsocket: TClientSocket read fSocket write fSocket;
Delphi-Quellcode:
TForm1 = class(TForm)
private
  fForm2: TForm2;
[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
  fForm2 := TForm2.Create(Self);
  fForm2.ClientSocket := Self.fClientSocket;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  fForm2.Free;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 15:04
Hallo, danke erstmal für die Hilfe.

Ich will es dann jetzt erstmal so machen, dass ich das CLientSocket
in einer eigenen Unit habe. Leider kommt da schon der Fehler, denn
wenn ich auf Werte zugreifen will, bekomme ich eine AV.

Zitat:
Im Projekt Project1.exe ist Exception der Klasse EAccessViolation aufgetreten
Meldung: Zugriffverletzung bei Adresse 0045522E im Modul Project1.exe.
Lesen von Adresse 00000004' Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Meine Unit sieht so aus:

Delphi-Quellcode:
unit dClientSock;

interface

uses ScktComp, Windows, Sysutils;

type
  TCLSocket = class
  tClientSck: TClientSocket;
  procedure ConnectClient(lpHost: String; iPort: Integer);
  procedure Send(lpTextMsg: String);
  function ReturnValue:String;
  procedure SetValue(lpNewValue: String);
  function ReturnConnect:Boolean;
  procedure tClientSckConnecting(Sender: TObject; Socket: TCustomWinSocket);
  procedure tClientSckConnect(Sender: TObject; Socket: TCustomWinSocket);
  procedure tClientSckDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  procedure tClientSckRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Privat }
  public
    { Publik }
end;

implementation

var
  gCurrentVal: String;
  bIsConnected: Boolean;
  gCurrentHost: String;

function TCLSocket.ReturnValue:String;
begin
  result := gCurrentVal;
end;

procedure TCLSocket.SetValue(lpNewValue: String);
begin
  gCurrentVal := '';
end;

function TCLSocket.ReturnConnect:Boolean;
begin
  result := bIsConnected;
end;

procedure TCLSocket.tClientSckConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
  bIsConnected := false;
  gCurrentVal := 'Connecting to ' + gCurrentHost;
end;

procedure TCLSocket.tClientSckConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  bIsConnected := true;
  gCurrentVal := 'Connected to ' + gCurrentHost;
end;

procedure TCLSocket.tClientSckDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  bIsConnected := false;
  gCurrentVal := 'Connection lost from ' + gCurrentHost;
end;

procedure TCLSocket.tClientSckRead(Sender: TObject; Socket: TCustomWinSocket);
var
  gServerText: String;
begin
  gServerText := Socket.ReceiveText;
end;

procedure TCLSocket.ConnectClient(lpHost: String; iPort: Integer);
begin
  gCurrentHost := lpHost;
  tClientSck.Port := iPort; //Access Violation
  //tClientSck.Host := lpHost;
  //tClientSck.Active := true;
end;

procedure TCLSocket.Send(lpTextMsg: String);
begin
  tClientSck.Socket.SendText(lpTextMsg);
end;

end.
Vielleicht keine schöne Lösung, aber wenn es klappt, reicht es erstmal. Wisst ihr was ich falsch gemacht habe?

Danke schon mal!
  Mit Zitat antworten Zitat
marabu

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

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 15:09
Du kapselst eine Komponente TClientSocket, statt davon abzuleiten. Okay, aber du musst die gekapselte Komponente auch instanzieren.

Freundliche Grüße
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 15:14
Ok, es scheint nun zu funktionieren, indem ich es einfach instanziiere. Danke für eure Hilfe.
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 18:43
Hallo, ich brauche doch noch mal eure Hilfe.!!

Ich habe es so versucht wie SirThornberry gesagt hat.

In der Form1 verbinde ich mich mit dem Server.

Wenn ich aber dann in Form2 oder Form3 etwas senden
will bekommen ich einen AV:

Zitat:
Zugriffverletzung bei Adresse 00458BC0 im Modul 'Project1.exe'. Lesen von Adresse 00000090
Weiß jemand warum das so ist?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 18:56
Die Adresse verrät das du entweder wieder etwas nicht instanziert hast oder du bei fForm2 den Socket gar nicht zugewiesen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 19:10
Naja, eigentlich habe ich das (habe auf der Form1 nicht selbst Instanziiert, sondern von der Komponentenleiste
auf die Form1 plaziert)..

Delphi-Quellcode:
//Form1
uses [...], clMessages, [...];
//clMessages ist die .pas Datei von der Form2.

type
  TForm1 = class(TForm)
    ClientSock: TClientSocket;
    procedure FormDestroy(Sender: TObject);
    procedure ClientSockConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSockConnecting(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSockDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSockRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  fForm2: TForm2;
  fForm3: TForm3;
  fForm4: TForm4;
  fForm5: TForm5;
  fForm6: TForm6;
  fForm7: TForm7;
  fForm8: TForm8;
  fForm9: TForm9;
  fForm10: TForm10;
  fForm11: TForm11;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Form2.Show;
     fForm2 := TForm2.Create(Self);
  fForm2.Clientsocket := Self.ClientSock;
  fForm3 := TForm3.Create(Self);
  fForm3.Clientsocket := Self.ClientSock;
  fForm4 := TForm4.Create(Self);
  fForm4.Clientsocket := Self.ClientSock;
  fForm5 := TForm5.Create(Self);
  fForm5.Clientsocket := Self.ClientSock;
  fForm6 := TForm6.Create(Self);
  fForm6.Clientsocket := Self.ClientSock;
  fForm7 := TForm7.Create(Self);
  fForm7.Clientsocket := Self.ClientSock;
  fForm8 := TForm8.Create(Self);
  fForm8.Clientsocket := Self.ClientSock;
  fForm9 := TForm9.Create(Self);
  fForm9.Clientsocket := Self.ClientSock;
  fForm10 := TForm10.Create(Self);
  fForm10.Clientsocket := Self.ClientSock;
  fForm11 := TForm11.Create(Self);
  fForm11.Clientsocket := Self.ClientSock;
    ClientSock.Port := 7000;
    ClientSock.Host := gHostAddr;
    currentHost := gHostAddr;
    ClientSock.Active := true;
end;

//Form2
type
    TForm2 = class(TForm)
    procedure cmdSendClick(Sender: TObject);
    procedure cmdCloseClick(Sender: TObject);
  private
    fSocket: TClientSocket;
    { Private-Deklarationen }
  public
    property Clientsocket: TClientSocket read fSocket write fSocket;
    { Public-Deklarationen }
  end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  fSocket.Socket.SendText('Hallo Server');
end;
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Form2 soll auf das ClientSocket von Form1 zugreifen

  Alt 10. Jun 2007, 21:09
Naja, das Problem ist, wo muss ich sie denn instanziieren? In der Form2 selber doch nicht, oder?

Delphi-Quellcode:
fForm2 := TForm2.Create(Self);
fForm2.Clientsocket := TSocket.Create(Form1);
fForm2.Clientsocket := Self.ClientSock;
So funktioniert es leider nicht.
  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:13 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