Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Statusbar Text, Panelbreite (https://www.delphipraxis.net/106853-statusbar-text-panelbreite.html)

max2621 17. Jan 2008 19:53


Statusbar Text, Panelbreite
 
Hallo,

Erneut sind fürmich einige Probleme nicht lösbar:

1.Ich habe mit Indy10 einen Telnet Client als Procedure geschrieben. Die Rückmeldungen des clients sollen jeweils in ein Panel der Statusbar geschrieben werden. Es gelingt mit dem folgenden Code die Meldungen des Servers jeweils in ein Memofeld zu schreiben. Im Panel passiert nichts beziehungsweise es erscheint nach disconnect nur die letzte Meldung:

Delphi-Quellcode:
procedure TForm1.TSReader;

begin

      TCPClient.Connect;
      if TCPClient.Connected then begin

      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.add(msg);

      TCPClient.IOHandler.WriteLn('stop');
      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.add(msg);
      statusbar1.Panels[2].Text:=msg;

      sleep (1000);

      TCPClient.IOHandler.WriteLn(tune);
      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.Add(msg);
      statusbar1.Panels[2].Text:=msg;

      TCPClient.IOHandler.WriteLn('stall 30');
      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.add(msg);
      statusbar1.Panels[2].Text:=msg;

      TCPClient.IOHandler.WriteLn(play);
      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.Add(msg);
      statusbar1.Panels[2].Text:=msg;

      TCPClient.IOHandler.WriteLn('play vlc1');
      msg:= TCPClient.IOHandler.ReadLn;
      Memo1.Lines.Add(msg);
      statusbar1.Panels[2].Text:=msg;

      TCPClient.Disconnect;

      VLCPlugin1.stop;
      VLCPlugin1.addTarget('http:wjonat.dyndns.org:80 :http-caching=3000)', null, VLCPlayListInsert, 0);
      Memo1.Lines.Add(msg);
      statusbar1.Panels[2].Text:=msg;
      VLCPlugin1.play;

   end;
end;

Was mache ich falsch?


Das zweite von mir nicht gelöste Problem betrifft die Breite eines Panels. Bei Grössenänderung des ProgrammFensters wird jeweils das rechte äusserste Panel (bei z.B. 3 Panels) angepasst, die beiden anderen Panels behalten ihre Breite. Ist es möglich, das die Breite desrechten Panels konstant bleibt aber das mittlere angepasst wird??

Wie man unschwer erkennt bin ich blutiger Anfänger und bin für jede Hilfe dankbar.

Euer Max2621

taaktaak 17. Jan 2008 20:06

Re: Statusbar Text, Panelbreite
 
Hallo Max,
zum ersten Punkt kann ich nix sagen, aber zum 2ten:
Na klar geht das! Du musst die Breite des 2ten (oder auch des 1sten Panels) anpassen, wenn sich die Fensterbreite ändert. Deine Anpassung muss beide Panels so in der Breite verändern, dass immer der gleiche Rest (für das dritte Panel) übrig bleibt. Wo musst du die Breite neu festlegen? Da bin ich mir nicht so sicher, würde sagen im OnResize-Event (Alternative wäre sonst noch OnDrawPanel)
Gruß Ralph

OG Karotte 17. Jan 2008 20:06

Re: Statusbar Text, Panelbreite
 
Formatiere doch bitte erst einmal Deinen Code
Delphi-Quellcode:
 Dein Code
Die entsprechenden BBCodes findest Du oberhalb der Textbox zum Schreiben der Nachricht (oder von Hand '['delphi']' bzw. '['/delphi']' (die eckigen Klammern jeweils ohne ')).

Zu deinem 2. Prob:
Code:
Breite des mittleren Panel := Breite des Fenster's (Statusleiste) - Breite des rechten Panel's - Breite des Linken Panel's

sirius 17. Jan 2008 20:12

Re: Statusbar Text, Panelbreite
 
In erster Instanz dürfte die ein Application.ProcessMessages nach jeder Textänderung helfen. Du kommst ja aus deiner Methode nicht zurück und deswegen kann sich der TExt auch nicht ändern, denn das steht in einer anderen Methode.
Das Memo schafft es (über sendmessage) sich selber zu verändern, das macht die Statusbar (und die meisten anderen Kompos)nicht. Das ist von dem Memo auch nicht so schön, aber nicht zu vermeiden.

Du solltest aber die Strktur deines Programmes noch mal Grundlegend überdenken. Du solltest mer ereignisorientiert arbeiten. Ich vermute, dass wird dir jetzt nicht viel sagen. Also: Du schickst ein Zeichen los. Das ist eine Methode und dann ist diese fertig. Bestimmt hat deine Komponente ein Ereignis, dass ausgelöst wird, wenn eine NAchricht zurückkommt. Nimm diese und mache dann deine nächsten Schritte. usw.... Dann benötigst du auch kein hässliches "sleep" und kein Application.processMessages.


Größe ändern:
Auch wieder auf ereignisse reagieren. Die Statusbar hat das Ereignis onResize. Genau dort ist es an der Zeit deine Panels neu auszurichten.

max2621 17. Jan 2008 20:26

Re: Statusbar Text, Panelbreite
 
Lieber Stefan, lieber Ralph,

vielen Dank für Eure schnelle Hilfe. Wenn ich darf möchte ich nochmal nachlegen. Das Problem ist, dass die Grösse des rechten Panels auch bei Verkleinern gleich bleibt und nur das mittlere die Grösse anpasst.

Ich hoffe ich drücke mich klar genug aus.

Code werde ich nächstes Mal richtig schreiben, wie gesagt blutiger Anfänger.

Euer
Max 2621

OG Karotte 17. Jan 2008 20:34

Re: Statusbar Text, Panelbreite
 
Deinen Code kannst Du / solltest Du immer noch "anpassen", denn bis zu einer Stunde nach dem Post kannst Du ihn noch editieren...

Zitat:

Zitat von max2621
Ich hoffe ich drücke mich klar genug aus.

Nö...

Zitat:

Zitat von max2621
Das Problem ist, dass die Grösse des rechten Panels auch bei Verkleinern gleich bleibt und nur das mittlere die Grösse anpasst.

Welches Panel möchtest Du denn anpassen ???

Das mittlere beim Vergrössern und das rechte beim Verkleinern :gruebel:

max2621 17. Jan 2008 20:34

Re: Statusbar Text, Panelbreite
 
Lieber Sirius,

auch Dir vielen Dnk. Ich begreiffe glaube ich was Du meinst und werde mich weiter vorantasten. Zum Problem 1 und dem ausgelösten Ereigniss. Ich will über den Telnetclient Befehle an den Server schicken die dieser jeweils nach abarbeiten mit einer Meldung quittiert. Dann folgt der nächste Befehl u.s.w. (Umschalten von TV Programmen auf einem Streaming Server).
Ist es unverschämt wenn ich Dich bitte ein kurzes Beispiel anhand meines Codes zu schicke. Ich will aber keinesfalls unverschämt sein.
Auch so hast Du geholfen.

Max 2621

max2621 17. Jan 2008 20:38

Re: Statusbar Text, Panelbreite
 
Lieber Stefan,

wie Du siehst lerne ich noch.

Gruss Max 2621

sirius 17. Jan 2008 20:40

Re: Statusbar Text, Panelbreite
 
Wenn du mir noch kurz sagst, welche Komponenten du verwendet hast...

max2621 17. Jan 2008 20:41

Re: Statusbar Text, Panelbreite
 
Lieber Stefan,

das mittlere soll die Grösse ändern oder anpassen egal ob vergrössern oder verkleinern., das rechte immer gleich bleiben.

Gruss Max 2621

max2621 17. Jan 2008 20:43

Re: Statusbar Text, Panelbreite
 
Lieber Sirius,

Indy 10 TdTCPClient. Ich hoffe, das ist die richtige Antwort.

Gruss Max 2621

sirius 17. Jan 2008 20:54

Re: Statusbar Text, Panelbreite
 
Ja, ich habs dann auch oben gelesen. Da ich Indy 9 habe kann ich dir nicht sagen, welches Ereignis da existiert. die beiden Versionen haben ziemlich große Unterschiede. Schau dir mal die Ereignisse an. Es muss ja eins geben, dass dir sagt, dass über das Netz eine neue NAchricht gekommen ist, die du auslesen kannst.

Dann etwa so (anhand deines Quelltextes; ob es mit diesem Konzept funktioniert kann ich nicht sagen):
Delphi-Quellcode:
procedure TForm1.TSReader_start;
begin
      TCPClient.Connect;
end;

procedure TForm1.TSReader_fin;
begin
      TCPClient.Disconnect;

      VLCPlugin1.stop;
      VLCPlugin1.addTarget('http:wjonat.dyndns.org:80 :http-caching=3000)', null, VLCPlayListInsert, 0);
      VLCPlugin1.play;
end;

procedure TForm1.getTCPMessage(...);//Das ist das Ereignis deiner Komponente, so etwa wie Button1Click nur eben nicht Button sondern TCP Message angekommen; musst du mal schauen.
                     
begin
  msg:= TCPClient.IOHandler.ReadLn;
  Memo1.Lines.Add(msg);
  statusbar1.Panels[2].Text:=msg;

  //Entweder auf die MEssage prüfen oder du nimmst einen Zähler
  if msg='...' then TCPClient.IOHandler.WriteLn('stop')
  else if msg='...' then TCPClient.IOHandler.WriteLn(tune)
  ...
  else if msg='...' then TCPClient.IOHandler.WriteLn('play vlc1')
  else TSReader_fin;
end;

taaktaak 17. Jan 2008 21:12

Re: Statusbar Text, Panelbreite
 
Hallo Max,

folgende Anregung für das Statusbar OnResize-Event...

Delphi-Quellcode:
procedure TfoTest9.StatusBar1Resize(Sender: TObject);
begin
  with StatusBar1 do begin
    Panels[0].Width:=50;              // v--- 4*2 = Rand-/Zwischenabstände
    Panels[1].Width:=foTest9.Width-50-50-4*2;
    end;
end;
kurze Erklärung:
Vorgabe : StatusBar hat 3 Panels; Panel[0] und Panel[2] sollen immer 50 Pixel breit sein
Ergebnis : mittleres Panel[1] ändert die Breite

Gruß Ralph

OG Karotte 17. Jan 2008 21:16

Re: Statusbar Text, Panelbreite
 
Delphi-Quellcode:
procedure TDeineForm.DeineStatusbarResize(Sender: TObject);
begin
  with DeineStatusbar do begin
    Panels[0].Width := 50; // Feste Breite links
    Panels[2].Width := 50; // Feste Breite rechts
    Panels[1].Width := DeineForm.Width - Panels[0].Width - Panels[2].Width; // Variable Breite in der Mitte
  end;
end;
Das sollte funktionieren...

[Edit] Uups, zu langsam und kein roter Kasten [/edit]

sirius 17. Jan 2008 21:22

Re: Statusbar Text, Panelbreite
 
[OT]
Du hast in einem Thread zwei Fragen gestellt. Vielleicht merkst du auch, dass das relativ ungünstig war, da sich jetzt der Thread aufteilt und die Bezüge teilweise fehlen. Besonders, wenn später mal jemand dasselbe Problem hat sieht er nicht mehr durch.
Also demnächst bitte immer ein Thema pro Thread auch wenn die Fragen ähnlich sind (man kann ja Links setzen).

Vielleicht kannst du das Thema mal teilen
[/OT]

max2621 18. Jan 2008 07:22

Re: Statusbar Text, Panelbreite
 
Lieber Sirius, Stefan und Ralph,

vielen Dank für Eure Unterstützung. Beide Probleme sind für mich jetzt gelöst. Darüber hinaus habe ich sehr viel zum Verhalten in Foren gelernt.

Nochmals herzlichen Dank Euer Max 2621


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 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