Dockmanager

Rund um die LCL und andere Komponenten
schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Das Ding soll mehrer Formulare (die nicht unbedingt Nachkommen von TForm sein müssen) gleichzeitig in einer Scrollbox oder Listbox darstellen. Das kann auch mehrfach das gleiche Formular sein, die werden dann in einer Liste gehalten und bekommen unterschiedliche Namen.

Die müssen bedienbar sein ohne deswegen modal zu werden. Alles was von TForm abstammt läßt sich aber nicht mit Create(Owner) einer Scrollbox oder Listbox als Komponente zuweisen. Zumindest bei Windoofs klappt deine Idee mit Parent:= Scrollbox auch nicht. Mit TFrame geht das aber, dann verhält sich das Ding genau wie eine beliebige visuelle Komponente.

Im "Formular" muß im Kontext ein Thread laufen, deswegen scheidet modal völlig aus. Sonst würden die Threads der anderen Formulare auf Eis gelegt (jedenfalls bei Delphi, das sollte da aber auch laufen).

Entscheidend ist, das man das "Formular" visuell entwickeln kann.

Mit den Frames geht das bei Delphi/Kylix unproblematisch, bei FPC/Lazarus nicht.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Zumindest bei Windoofs klappt deine Idee mit Parent:= Scrollbox auch nicht.


Du hast dir den Screenshot den ich gepostet habe mal angesehn ?
Also wenn das keine Form in einer Scrollbox ist weiss ich auch nicht.

Und was du immer mit modalen Formularen willst verstehe ich nicht.
Modale Formulare dürften nicht dockbar sein ich würde aber auch nie auf die idee kommen es zu probieren.

Was ich auch nicht verstehe ist warum Threads auf modalen formularen nicht laufen sollen das ist totaler quatsch. Threads sind völlig Formularunabhängig die laufen auch weiter wenn die ne Modale form auf hast und sie sich nicht auf dieser Form befinden. Modal sagt auch nicht aus das deine Fenster im Hintergrund nicht mehr arbeiten sie sind halt nur nicht bedienbar.

Ich seh immer noch kein Problem.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Aber nicht bei Delphi/Kylix, da hängt der Thread an dem Fromular in dem er aufgebaut wird. Verliert das Formular den Fokus liegt der Thread auf Eis, genau das darf aber nicht passieren.

Dann hab ich deinen Vorschlag getestet, das läuft bei Windoofs bei mir nicht. Das Formular wird nicht dargestellt.

Und ich will nix mit modalen Formularen, ich will gar keine. Um aber eine visuelle Komponenente in der IDE zu bauen geht das eben nur mit TForm mit allen Nachteilen die das hat.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Aber nicht bei Delphi/Kylix, da hängt der Thread an dem Fromular in dem er aufgebaut wird.


Kann ich nicht richtig glauben aber auch nicht wiederlegen. Wir sind hier übrigends im Lazarusforum und bei fpc/lazarus ist der Thread nicht formularabhängig. Kann das mit Delphi jemand bestätigen ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

So, nun mal Butter bei die Fische:

Code: Alles auswählen

// liegt im Mainform und produziert verschiedene ChatServer
{-----------------------------------------------------------------------------
  Class:     TfoChatServerForm
  Method:    CreateChatRoomObject
  Author:    root
  Date:      08-Jun-2006
  Arguments: AChatRoom: TChatRoomStruct
  Result:    TFrmChatRoom
-----------------------------------------------------------------------------}

function TfoChatServerForm.CreateChatRoomObject
  (AChatRoom: TChatRoomStruct; var y0, x0: integer): TFrmChatRoom;
const
  cProcName = 'uFoChatServerForm.TfoChatServerForm.CreateChatRoomObject';
 
  function SetErrorParams: string;
  begin
    Result:= '';
    // 'AChatRoom: TChatRoomStruct'
    // 'TFrmChatRoom';
  end; // of function SetErrorParams: string
 
var
  RoomObj: TFrmChatRoom;
begin
  { function body }
  Result:= nil;
  if (AChatRoom <> nil) then begin
    try
      RoomObj:= TFrmChatRoom.Create(sbChatRoomObjects);
      RoomObj.ParentFont:= false;
      RoomObj.OnMinimize:= UpdateObjectScroller;
      RoomObj.OnMaximize:= UpdateObjectScroller;
      RoomObj.RoomSrv := tcpChatSrv;
      RoomObj.Channel := tcpChatSrv.DefaultPort;
      RoomObj.RoomName:= AChatRoom.RoomName;
      RoomObj.Password:= AChatRoom.RoomPwd;
      RoomObj.Parent:= sbChatRoomObjects;
      RoomObj.Top := y0;
      RoomObj.Left:= x0;
      y0:= y0 + RoomObj.Height + 4;
      Result:= RoomObj;
    except
      raise;
    end;
  end; // of if (AChatRoom <> nil) then begin
end; // of TfoChatServerForm.CreateChatRoomObject


Code: Alles auswählen

// so ist das ChatServerFrame deklariert
  TfrmChatRoom = class(TFrame)
    ClientForm1: TClientForm;
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    lblRoomName: TLabel;
    Label2: TLabel;
    lblChannel: TLabel;
    Label3: TLabel;
    lblClientCounter: TLabel;
    Label4: TLabel;
    lblPassword: TLabel;
    Panel3: TPanel;
    Panel4: TPanel;
    lbxClients: TListBox;
    Panel5: TPanel;
    Panel6: TPanel;
    lbxMessages: TListBox;
    ToolBar1: TToolBar;
    tbtnConnect: TToolButton;
    tbtnRefreshClients: TToolButton;
    ImgList: TImageList;
    ToolButton3: TToolButton;
    tbtnKickClient: TToolButton;
    tbtnMsgToClient: TToolButton;
    ToolButton6: TToolButton;
    FRoomSrv: TTCPChatServer;
    FThreadMgr: TIdThreadMgrDefault;
  private
    FOnMinimize   : TNotifyEvent;
    FOnMaximize   : TNotifyEvent;
    FOnFormClose  : TNotifyEvent;
    FOnFormRestore: TNotifyEvent;
 
    function  GetRoomSrv: TTCPChatServer;
    procedure SetRoomSrv(Value: TTCPChatServer);
    function  GetRoomName: string;
    procedure SetRoomName(Value: string);
    function  GetPassword: string;
    procedure SetPassword(Value: string);
    function  GetChannel: integer;
    procedure SetChannel(Value: Integer);
    function  GetClientCounter: integer;
    procedure SetClientCounter(Value: Integer);
    function  GetOnline: boolean;
    procedure SetOnline(Value: boolean);
    procedure DoMinimize(ASender: TObject);
    procedure DoMaximize(ASender: TObject);
    procedure DoFormClose(ASender: TObject);
    procedure DoFormRestore(ASender: TObject);
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
 
    function SetFormCaption: string;
 
    property RoomSrv: TTCPChatServer read GetRoomSrv write SetRoomSrv;
    property RoomName: string read GetRoomName write SetRoomName;
    property Password: string read GetPassword write SetPassword;
    property Channel : integer read GetChannel write SetChannel;
    property ClientCounter : integer
      read GetClientCounter write SetClientCounter;
    property Online: boolean read GetOnline write SetOnline;
    property OnMinimize: TNotifyEvent read FOnMinimize write FOnMinimize;
    property OnMaximize: TNotifyEvent read FOnMaximize write FOnMaximize;
    property OnFormClose: TNotifyEvent read FOnFormClose write FOnFormClose;
    property OnFormRestore: TNotifyEvent
      read FOnFormRestore write FOnFormRestore;
  end; // of TfrmChatRoom


Code: Alles auswählen

// und so wird in MainForm die ScrollBox gesteuert
{-----------------------------------------------------------------------------
  Class:     TfoChatServerForm
  Methode:   UpdateObjectScroller
  Author:    root
  Date:      09-Jun-2006
  Arguments: ASender: TObject
-----------------------------------------------------------------------------}

procedure TfoChatServerForm.UpdateObjectScroller(ASender: TObject);
const
  cProcName = 'uFoChatServerForm.None.UpdateObjectScroller';
 
  function SetErrorParams: string;
  begin
    Result:= '';
    // 'None'
  end; // of function SetErrorParams: string
 
var
  AObj,
  AObjSuc: TFrame;
  i      : integer;
begin
  { procedure body }
  i:= Self.FRoomObjList.IndexOf(pointer(ASender));
  if (i >= 0) then begin
    AObj:= TFrame(ASender);
    if (i < Self.FRoomObjList.Count - 1) then begin
      while (i < Self.FRoomObjList.Count - 1) do begin
        AObjSuc:= TFrame(Self.FRoomObjList[i + 1]);
        AObjSuc.Top:= AObj.Top + AObj.Height + 4;
        AObj:= AObjSuc;
        inc(i);
      end; // of while (i < Self.FRoomObjList.Count - 1) do begin
      Self.FsbRoomObj_y0:= AObj.Top + AObj.Height + 4;
    end // of if (i < Self.FRoomObjList.Count - 1) then begin
    else Self.FsbRoomObj_y0:= AObj.Top + AObj.Height + 4;
  end; // of if (i >= 0)
end; // of TfoChatServerForm.UpdateObjectScroller


Das hab ich bestimmt nicht so gemacht, weil ich vergnügungssüchtig bin. Das ging einfach nicht anders. Jeder produzierte Server ist aktiv und verarbeitet seine eigenen Anforderungen. Auch dann noch wenn ich Visible:= false setze.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben:
Aber nicht bei Delphi/Kylix, da hängt der Thread an dem Fromular in dem er aufgebaut wird.


Kann ich nicht richtig glauben aber auch nicht wiederlegen. Wir sind hier übrigends im Lazarusforum und bei fpc/lazarus ist der Thread nicht formularabhängig. Kann das mit Delphi jemand bestätigen ?


So ein Schmarren. Das würde ja bedeuten das jedes Formular einen eigenen Thread hat.
Das wüsst' ich aber.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Nö, aber der wird vom MainThread ausgeblendet und bleibt deshalb stehen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:Nö, aber der wird vom MainThread ausgeblendet und bleibt deshalb stehen.


Hihihihi! Du wirst ja immer besser! :)

Aber könntest du solche Beiträge nicht mit bezeichnen? Nur so für die noobs.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

@theo

Ich hab das probiert, die Ereignisse werden zwar angenommen aber nicht verarbeitet. Erst wenn du das Ding modal machst fängt der an alle liegengebliebenen Ereignisse abzuarbeiten. Das ist aber nicht Sinn der Übung.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Hast du was getrunken ?
Ereignisse werden über die WndProc abgearbeitet Threads haben mit der Windowproc nichts zu tun !!
Obwohl ich auch nicht glaube das die Windowprocs nicht mehr aufgerufen werden wenn ich ne modale form habe ich denke eher alle eingabeereignisse werden gefiltert.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Nochmal, ich habs probiert. Bei Delphi/Kylix ist das Ding aus dem Messagehandling raus und nimmt nix mehr an. Die Queue läuft voll und das wars. Die TCPChatServer-Komponente hat als Eigentümer den Frame, damit gilt das auch für den Teil des Protokolls das über einen Command-String verfügt für den die Methode im Frame deklariert ist. Da der Thread implizit in TTCPChatServer deklariert ist und diese Komponente die Ereignisweitergabe an den Frame regelt wird der seine Ereignisse bei Verwendung eines Formulars nicht mehr los. Mach das auf nem Formular und das dreht dir ne Nase.

Und auf derart gefährliche Spielchen laß ich mich nicht ein wenn das nicht sein muß. Und das muß nicht sein, wie oben gezeigt.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

So jetzt reichts habs eben probiert und ein Thread läuft mit Delphi6 weiter auch wenn ein Modales form im vordergrund liegt. Ich häng das Testprojekt an...

Und Schnulli was immer du nimmst hör besser auf :)
Dateianhänge
Project1.zip
(3.21 KiB) 50-mal heruntergeladen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Christian hat geschrieben:Und Schnulli was immer du nimmst hör besser auf :)


Tu mal lieber die Möhrchen
Tu mal lieber die Möhrchen,Mama
Tu mal lieber die Möhrchen
Die Möhrchen gib die Möhrchen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

wenn jemand einen fahren läßt stinkt der auch sofort ohne das du erst das "Riechformular" modal machst.

Ok, das ist verständlich, jetzt bau den nächsten Schritt darauf auf
:mrgreen:

ch hab das probiert, die Ereignisse werden zwar angenommen aber nicht verarbeitet. Erst wenn du das Ding modal machst fängt der an alle liegengebliebenen Ereignisse abzuarbeiten. Das ist aber nicht Sinn der Übung.

Ereignisse an Applikation umleiten un dort dispatchen ?!
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ereignisse an Applikation umleiten un dort dispatchen ?!


jetzt lern du nicht auch noch schnulloreanisch
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten