Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktion Copy verwenden - wie? (https://www.delphipraxis.net/162334-funktion-copy-verwenden-wie.html)

Lyan 18. Aug 2011 07:59

Delphi-Version: XE

Funktion Copy verwenden - wie?
 
Hallo,

ich bin zur Übung an einem Chatprogramm dran! Nun kann man sich das ganze so vorstellen:

1)Der User wird aufgefordert einen Usernamen, eine Chatfarbe(mit colordialog), den Host und den Port auszuwählen. (Über TServerSocket und TClientSocket) // Bitte nicht sagen ich soll die Indy's benutzen! ;D

2)Sofern die Verbindung geklappt hat wird man auf die 2te Seite des Tabsheeds weitergelassen.
Dort findet man oben eine Richbox(Protokoll(wo die User drin chatten)), ein Memo zum senden von Nachrichten und wichtig noch der Sende Button!

3) Im Memo (da wo man die Nachricht eintippt) ist nun die Schriftfarbe zusehen die man auf Seite 1 im colordialog ausgewählt hat!

4) Per Attribute habe ich nun die Farbe auch in der Richbox (da wo die Messages gesendet werden) in der Farbe wo man ausgewählt hat!


Problem?
Ich konnte nur clientseitig die Farben ändern:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
with richedit1.selattributes do
begin
  if strtoint(memo2.Text) <> 0 then
  richedit1.SelAttributes.Style := [fsBold];
  client.socket.SendText(inttostr(colordialoguser.color) + editusername.text + ' -> ' + memo2.text);
  memo2.Clear;
end;
end;
Wie man sieht wird über diese Zeile: (client.socket.SendText(inttostr(colordialoguser.c olor) + editusername.text + ' -> ' + memo2.text);) ja was an denn Server gesendet. Nämlich 3 Strings!

1 String: Farbe(Coolodialoguser.color)

2 String: Username(editusername.text)

3 String: Nachricht(memo2.text)


--------------------------------------------

So das sollte ja so klappen (also das die Strings so an den Server gesendet werden!)

Nun zum Problem (das nämlich beim Server liegt der den String aufteilen soll und die Farbe ect. erkennen soll)


Code:
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
    Nachricht: AnsiString;
    sTeilen: String;
    aColor: TColor;
begin
  with richeditmaster.selattributes do
  begin
    Nachricht:= Socket.ReceiveText;
    sTeilen := copy(Nachricht, 1,3);
    aColor := TColor(StrToInt(sTeilen));
    RicheditMaster.Lines.Add(Nachricht);
    for i := 0 to server.Socket.ActiveConnections - 1 do
    server.socket.Connections[i].SendText(Nachricht);

  end;
end;
end.
Bin Anfänger! Kann mir da jemand helfen ? Ich weiß nicht ganz wie ich das jetzt genau machen muss, dass die Farbe dem User zugeordnet wird und mitgesendet wird + den Username und eben der Nachricht!

Wäre echt super wenn jemand das direkt lösen könnte mit copy o.ä :)


Vielen Dank im vorraus!

DeddyH 18. Aug 2011 08:07

AW: Funktion Copy verwenden - wie?
 
Du kannst entweder klassisch den Debugger benutzen oder Dir die geschriebenen/gelesenen Werte einfach einmal ausgeben lassen.
Delphi-Quellcode:
ShowMessage(inttostr(colordialoguser.color)); //beim Senden

sTeilen := copy(Nachricht, 1,3);
ShowMessage(sTeilen); //beim Empfangen
Ich möchte bezweifeln, dass die Länge von 3 Zeichen stimmt.

Lyan 18. Aug 2011 08:10

AW: Funktion Copy verwenden - wie?
 
Zitat:

Zitat von DeddyH (Beitrag 1117720)
Du kannst entweder klassisch den Debugger benutzen oder Dir die geschriebenen/gelesenen Werte einfach einmal ausgeben lassen.
Delphi-Quellcode:
ShowMessage(inttostr(colordialoguser.color)); //beim Senden

sTeilen := copy(Nachricht, 1,3);
ShowMessage(sTeilen); //beim Empfangen
Ich möchte bezweifeln, dass die Länge von 3 Zeichen stimmt.

Es wird vor den Namen immer eine 3 stellige Zahl angehongen (z.B. 255)

himitsu 18. Aug 2011 08:13

AW: Funktion Copy verwenden - wie?
 
Delphi-Referenz durchsuchenPos
Delphi-Referenz durchsuchenPosEx
Hier im Forum suchenSplit

Trennzeichen überall dazwischen und dann das Trennzeichen suchen und an diesen Grenzen die Einzelteile rauskopieren.


PS: Ohne Trennzeichen zwischenchen Color und Username wird es etwas schwer.
> alle Zahlen am Anfang suchen und nach Letzen beginnt der Username,
oder man nimmt eine feste Anzahl an Ziffern, mit führenden Nullen/Leerzeichen.

Sir Rufo 18. Aug 2011 08:15

AW: Funktion Copy verwenden - wie?
 
Zitat:

Zitat von Lyan (Beitrag 1117722)
Zitat:

Zitat von DeddyH (Beitrag 1117720)
Du kannst entweder klassisch den Debugger benutzen oder Dir die geschriebenen/gelesenen Werte einfach einmal ausgeben lassen.
Delphi-Quellcode:
ShowMessage(inttostr(colordialoguser.color)); //beim Senden

sTeilen := copy(Nachricht, 1,3);
ShowMessage(sTeilen); //beim Empfangen
Ich möchte bezweifeln, dass die Länge von 3 Zeichen stimmt.

Es wird vor den Namen immer eine 3 stellige Zahl angehongen (z.B. 255)

Du hast also nur Werte von 100 bis 999 dort?

DeddyH 18. Aug 2011 08:22

AW: Funktion Copy verwenden - wie?
 
Das müsste rot sein, richtig? Das Problem ist, dass TColor sehr viel größer sein kann, Du mit 3 Stellen also nicht mehr auskommst. Daher musst Du sicherstellen, dass immer die gleiche Stringlänge verwendet wird. Versuch es einmal so:
Delphi-Quellcode:
c := colordialoguser.color;
Farbstring := Format('%.2x%.2x%.2x', [GetBValue(c), GetGValue(c), GetRValue(c)]);
Wenn ich keinen Fehler gemacht habe, sollten das dann immer 6 Zeichen sein. Beim Empfangen kopierst Du diese 6 Zeichen aus dem Stringanfang, setzt ein $ davor und kannst sie direkt in TColor umwandeln.
Delphi-Quellcode:
c := Copy(DeinText, 1, 6);
Delete(DeinText, 1, 6);
Color := StrToInt('$' + c);

Lyan 18. Aug 2011 08:32

AW: Funktion Copy verwenden - wie?
 
Zitat:

Zitat von DeddyH (Beitrag 1117726)
Das müsste rot sein, richtig? Das Problem ist, dass TColor sehr viel größer sein kann, Du mit 3 Stellen also nicht mehr auskommst. Daher musst Du sicherstellen, dass immer die gleiche Stringlänge verwendet wird. Versuch es einmal so:
Delphi-Quellcode:
c := colordialoguser.color;
Farbstring := Format('%.2x%.2x%.2x', [GetBValue(c), GetGValue(c), GetRValue(c)]);
Wenn ich keinen Fehler gemacht habe, sollten das dann immer 6 Zeichen sein. Beim Empfangen kopierst Du diese 6 Zeichen aus dem Stringanfang, setzt ein $ davor und kannst sie direkt in TColor umwandeln.
Delphi-Quellcode:
c := Copy(DeinText, 1, 6);
Delete(DeinText, 1, 6);
Color := StrToInt('$' + c);

Danke hat so funktioniert :)
Super !

Lyan 18. Aug 2011 08:50

AW: Funktion Copy verwenden - wie?
 
oh ehm, hat zwar geklappt,. aber dadurch das es nun formated ist, sind die Farben durcheinander!

Also wenn ich im colordialog user nun Gelb wähle ,kommt limegreen bei raus ect.!

DeddyH 18. Aug 2011 08:57

AW: Funktion Copy verwenden - wie?
 
Das kann ich hier nicht nachvollziehen. Hast Du die GetXValue-Aufrufe evtl. vertauscht?

Lyan 18. Aug 2011 09:08

AW: Funktion Copy verwenden - wie?
 
Client Source:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, inifiles, ComCtrls, Character, unit2;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Client: TClientSocket;
    Button4: TButton;
    Button2: TButton;
    Button1: TButton;
    GroupBox2: TGroupBox;
    Memo2: TMemo;
    GroupBox1: TGroupBox;
    TabSheet2: TTabSheet;
    ColorDialoguser: TColorDialog;
    Button3: TButton;
    GroupBox3: TGroupBox;
    labelUsername: TLabel;
    Labelhost: TLabel;
    Labelport: TLabel;
    Labelcolor: TLabel;
    Editusername: TEdit;
    Edithost: TEdit;
    Editport: TEdit;
    ButtonColor: TButton;
    Buttonconnect: TButton;
    Edit1: TEdit;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    RichEdit1: TRichEdit;
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TabSheet2ContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
    procedure ButtonconnectClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ButtonColorClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private-Deklarationen }
    inifileuser: Tinifile;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var c: Integer;
var Farbstring: String;
begin
with richedit1.selattributes do
begin
  c := colordialoguser.color;
  Farbstring := Format('%.2x%.2x%.2x', [GetBValue(c), GetGValue(c), GetRValue(c)]);
  if strtoint(memo2.Text) <> 0 then
  richedit1.SelAttributes.Style := [fsBold];
  client.socket.SendText(inttostr(c) + editusername.text + ' -> ' + memo2.text);
  memo2.Clear;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
application.Terminate
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
memo2.Clear;
memo2.lines.Add('Client 1.0 - Lyan');
end;

procedure TForm1.ButtonColorClick(Sender: TObject);
var c: Integer;
var Farbstring: String;
begin
  c := colordialoguser.color;
  Farbstring := Format('%.2x%.2x%.2x', [GetBValue(c), GetGValue(c), GetRValue(c)]);
  if colordialoguser.Execute then
  begin
    inifileuser.WriteString('Userinfo','Farbe',IntToStr(c));
    Edit1.Color := c;
  end;
end;

procedure TForm1.ButtonconnectClick(Sender: TObject);
var iLength: Integer;
begin
Inifileuser.WriteString('Userinfo', 'Username', Editusername.text );
Inifileuser.WriteString('Userinfo', 'Host', Edithost.text );
Inifileuser.WriteString('Userinfo', 'Port', Editport.text );
Inifileuser.WriteString('Userinfo', 'Chatfarbe', IntToStr(ColorDialoguser.Color));

if (editusername.Text <> '') AND (editport.Text <> '') AND (edithost.Text <> '') then
  begin
    iLength := Length(editusername.Text);
    if (iLength > 3) then
    begin
      try
        client.Host := edithost.text;
        client.Port := strtoint(editport.text);
        client.Active := True;
        pagecontrol1.ActivePage := tabsheet1;
        unit2.Form2.Show;
      except
        ShowMessage('Connection failed! Please check your Host or Port number!');
      end;
    end;
  end
  else
  begin
    Showmessage('Entweder haben sie vergessen ein Feld auszufüllen, oder ihr Username ist zu kurz!');
  end;
end;


procedure TForm1.ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
richedit1.Lines.Add('Status: verbunden mit ' + socket.RemoteAddress);
end;

procedure TForm1.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
richedit1.Lines.Add('Status: getrennt mit ' + socket.RemoteAddress);
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
richedit1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.FormCreate(Sender: TObject);
var suserpath: String;
sFarbe: String;
begin
  PageControl1.ActivePage := TabSheet2;
  suserpath := ExtractFilePath(ParamStr(0));
  if not DirectoryExists('Usersettings') then
    CreateDir('Usersettings');

  inifileuser:=Tinifile.Create(suserpath + ('\Usersettings\Usersettings.ini'));
  editusername.Text:=inifileuser.ReadString('Userinfo', 'Username', '');
  editHost.Text:=inifileuser.ReadString('Userinfo', 'Host', '');
  editPort.Text:=inifileuser.ReadString('Userinfo', 'Port', '');
  sFarbe := inifileuser.ReadString('Userinfo', 'Farbe', InttoStr(clBlack));
  sFarbe := inifileuser.ReadString('Userinfo', 'Chatfarbe', InttoStr(clBlack));
  try
    Color := StrToInt(sFarbe);
  except
    Color := clBlack;
  end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  try
  inifileuser.free
  except
  end;
end;


procedure TForm1.TabSheet2ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
  var sFarbe: String; suserpath: String;

begin
    suserpath := ExtractFilePath(ParamStr(0));
  if not DirectoryExists('Usersettings') then
    CreateDir('Usersettings');

  inifileuser:=Tinifile.Create(suserpath + ('\Usersettings\Usersettings.ini'));
  editusername.Text:=inifileuser.ReadString('Userinfo', 'Username', '');
  editHost.Text:=inifileuser.ReadString('Userinfo', 'Host', '');
  editPort.Text:=inifileuser.ReadString('Userinfo', 'Port', '');
  sFarbe := inifileuser.ReadString('Userinfo', 'Farbe', InttoStr(clBlack));
  sFarbe := inifileuser.ReadString('Userinfo', 'Chatfarbe', InttoStr(clBlack));
  try
    Color := StrToInt(sFarbe);
  except
    Color := clBlack;
  end;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  label1.Caption := inttostr(trackbar1.Position);
  form1.AlphaBlendValue := strtoint(label1.Caption);
end;

end.






Client:

Code:
unit UnitServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Inifiles, ScktComp, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    EditPort: TEdit;
    Label1: TLabel;
    GroupBoxProtokoll: TGroupBox;
    ButtonStarten: TButton;
    ButtonAnhalten: TButton;
    ButtonClear: TButton;
    ButtonSenden: TButton;
    ButtonBeenden: TButton;
    EditSenden: TEdit;
    LabelUser: TLabel;
    Server: TServerSocket;
    ListBoxUser: TListBox;
    RichEditMaster: TRichEdit;
    procedure ButtonStartenClick(Sender: TObject);
    procedure ButtonAnhaltenClick(Sender: TObject);
    procedure ButtonClearClick(Sender: TObject);
    procedure ButtonBeendenClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure ButtonSendenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure EditPortExit(Sender: TObject);
  private
    { Private-Deklarationen }
    inifilemain: TIniFile;
  public
    { Public-Deklarationen }
  end;

var
  {Variablen}
  Form1: TForm1;
  Userzahl:Integer;
  i:Integer;

implementation

{$R *.dfm}

procedure TForm1.ButtonStartenClick(Sender: TObject);
begin
{Server Verbindung (Port) wird aus Edit1 gelesen on button1.click}
  Server.Port:= strtoint(EditPort.Text);
  Server.Active:=True;
  Buttonstarten.Enabled:=False;
  Buttonanhalten.Enabled:=True;
  RicheditMaster.Lines.Add('Status: Server gestartet.');

end;

procedure TForm1.ButtonAnhaltenClick(Sender: TObject);
begin
{Server.Active wird auf false gesetzt wenn der Server angehalten wird}
  Server.Port:= strtoint(Editport.Text);
  Server.Active:=False;
  Buttonstarten.Enabled:=True;
  Buttonanhalten.Enabled:=False;
  RicheditMaster.Lines.Add('Status: Server angehalten.');
end;

procedure TForm1.ButtonClearClick(Sender: TObject);
begin
{Protokoll wird "gelöscht"}
  RicheditMaster.Lines.Clear;
  RicheditMaster.Lines.Add('Server 1.0');
end;

procedure TForm1.ButtonSendenClick(Sender: TObject);
var i:integer;
begin
{Server schickt eine Nachricht an alle User}
  for i := 0 to server.Socket.ActiveConnections - 1 do
  server.Socket.Connections[i].SendText('Nachricht von Server: ' + editsenden.Text);
  RicheditMaster.Lines.Add('Nachricht von Server: ' + editsenden.Text);
end;


procedure TForm1.ButtonBeendenClick(Sender: TObject);
begin
        {Anwendung schließen}
  server.Active:=false;
  application.Terminate;
end;


procedure TForm1.EditPortExit(Sender: TObject);
begin
    InifileMain.WriteString('Port', 'Portvalue', editport.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
var Inifilepath: String;
begin
  inifilepath:=extractfilepath(ParamStr(0));
  InifileMain:=TIniFile.Create(inifilepath + ('startup.ini'));
  Editport.Text:=InifileMain.ReadString('Port', 'portvalue', '');
end;


procedure TForm1.FormDestroy(Sender: TObject);
var sExeVerzeichnis: string;
begin
  server.Active:=false;
  sExeVerzeichnis := ExtractFilePath(ParamStr(0));
  if not DirectoryExists(sExeVerzeichnis+'VerlaufProtokoll') then
  CreateDir(sExeVerzeichnis+'VerlaufProtokoll')
  else
    begin
         RicheditMaster.lines.SaveToFile(sExeVerzeichnis+'\VerlaufProtokoll\TEst1337.txt');
    end;
  try
    InifileMain.free;
  except
  end;
end;

procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  RicheditMaster.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.');
  Userzahl:=Userzahl +1;
  labeluser.caption:='User: ' + inttostr(Userzahl);
  ListBoxUser.Items.Add(Socket.RemoteAddress );
end;

procedure TForm1.ServerClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  RicheditMaster.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' getrennt.');
  Userzahl:=Userzahl -1;
  labeluser.caption:='User: ' + inttostr(Userzahl);
end;

procedure TForm1.ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  RicheditMaster.Lines.Add('Status: Client ' + socket.RemoteAddress + 'hat den Fehler' + inttostr(Errorcode));
  Userzahl:=Userzahl -1;
  labeluser.caption:='User: ' + inttostr(Userzahl);
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
    Nachricht: AnsiString;
    Color: TColor;
    c: string;
begin
    Nachricht:= Socket.ReceiveText;
    c := copy(Nachricht, 1,6);
    delete(Nachricht, 1,6);
    Color:=StrToInt(('$' + c));
    for i := 0 to server.Socket.ActiveConnections - 1 do
    server.socket.Connections[i].SendText(Nachricht);

  end;
end.

Versuch es bitte :D Ich blick nicht durch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.
Seite 1 von 3  1 23      

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