Dockmanager
-
- 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
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.
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)
(Ringelnatz)
-
- 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:
Du hast dir den Screenshot den ich gepostet habe mal angesehn ?Zumindest bei Windoofs klappt deine Idee mit Parent:= Scrollbox auch nicht.
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/
-
- 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
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.
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)
(Ringelnatz)
-
- 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:
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 ?Aber nicht bei Delphi/Kylix, da hängt der Thread an dem Fromular in dem er aufgebaut wird.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- 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
So, nun mal Butter bei die Fische:
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.
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
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.
(Ringelnatz)
(Ringelnatz)
So ein Schmarren. Das würde ja bedeuten das jedes Formular einen eigenen Thread hat.Christian hat geschrieben: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 ?Aber nicht bei Delphi/Kylix, da hängt der Thread an dem Fromular in dem er aufgebaut wird.
Das wüsst' ich aber.
-
- 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
-
- 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
-
- 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:
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.
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/
-
- 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
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.
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)
(Ringelnatz)
-
- 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:
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
Und Schnulli was immer du nimmst hör besser auf

- Dateianhänge
-
Project1.zip
- (3.21 KiB) 63-mal heruntergeladen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
- af0815
- Lazarusforum e. V.
- Beiträge: 6768
- 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:
Ok, das ist verständlich, jetzt bau den nächsten Schritt darauf aufwenn jemand einen fahren läßt stinkt der auch sofort ohne das du erst das "Riechformular" modal machst.

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