Component drop

Tags:    delphi

Er der nogen der kan hjælpe med følgende problem vedr. komponent programmering.

Hvordan forhindrer man "child" komponenter i at blive droppet i et eller
flere områder af en "parent" kontrol når man er i "csDesigning" mode ?

Indtil videre står det klart at jeg ikke kan bruge WM_NotifyParent beskeden,
da den tilsyneladende kun fungerer i "Runtime" mode.
Ej heller hjælper det at returnere beskyttede arealer via behandling af WM_GetMinMaxInfo beskeden da dette kun giver mulighed for at beskytte et rektangulært areal.

Det står måske ikke lysende klart hvad jeg mener så her er et eksempel:

Jeg har fabrikeret en "Groupbox" komponent. Den har en bred ramme samt en afrundet "captionbox" inde i dens "clientrect". Det er muligt at placere/droppe komponenter oven i denne "captionbox". Hvordan forhindrer jeg det ?

Er der en simpel løsning jeg har overset ?
[Redigeret d. 27/02-03 13:02:14 af Stig Falck Hansen]



5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Er der nogen der kan hjælpe med følgende problem vedr. komponent programmering.

Hvordan forhindrer man "child" komponenter i at blive droppet i et eller
flere områder af en "parent" kontrol når man er i "csDesigning" mode ?

Indtil videre står det klart at jeg ikke kan bruge WM_NotifyParent beskeden,
da den tilsyneladende kun fungerer i "Runtime" mode.
Ej heller hjælper det at returnere beskyttede arealer via behandling af WM_GetMinMaxInfo beskeden da dette kun giver mulighed for at beskytte et rektangulært areal.

Det står måske ikke lysende klart hvad jeg mener så her er et eksempel:

Jeg har fabrikeret en "Groupbox" komponent. Den har en bred ramme samt en afrundet
"captionbox" inde i dens "clientrect". Det er muligt at placere/droppe komponenter oven
i denne "captionbox". Hvordan forhindrer jeg det ?

Er der en simpel løsning jeg har overset ?


Hej,

I din komponents "ControlStyle" skal du exclude "csAcceptsControls".

F.eks.

constructor TYourComponent.Create(AOwner: TComponent);
var
Tmp : TControlStyle;
begin
inherited Create(AOwner);
Tmp := ControlStyle;
Exclude(Tmp, csAcceptsControls);
ControlStyle := Tmp;
// Your other creation stuff ;0)
end;

Mvh
Michael.



Tak for et hurtigt svar Michael, men det løser ikke problemet.

Det ville være rimeligt skørt at lave en Tgroupbox der ikke accepterer andre komponenter, da det jo netop er formålet med en groupbox.[Redigeret d. 27/02-03 13:03:35 af Stig Falck Hansen]



Desværre gutter, jeg har lige fundet ud af det selv.
Sad lige og rodede rundt i Controls.int, og vupti der lå en del af løsningen.

Deklaration:

procedure CMControlChange(var Message : TCMControlChange); message CM_ControlChange;

Implementering:

procedure TMyGroupBox.CMControlChange(var Message : TCMControlChange);
begin
inherited;
ShowMessage('CMControlChange');
if Message.Inserting then begin
// Flyt den komponent der blev droppet her
........
f.eks
if Message.Control.Left < fBorderWidth then
Message.Control.Left := BorderWidth + 2; // flyt den indenfor venstre side af rammen
end else Message.Result := Message.Result;
end;

Nu mangler jeg så bare lige at finde ud af hvad der skal ske hvis der flyttes på komponenten.

Jeg vidste at det var simpelt, men for f....... da hvor kan det bare tage lang tid at
finde løsningen.

Nååå Im off[Redigeret d. 27/02-03 14:04:06 af Stig Falck Hansen]



Desværre gutter, jeg har lige fundet ud af det selv.
Sad lige og rodede rundt i Controls.int, og vupti der lå en del af løsningen.

Deklaration:

procedure CMControlChange(var Message : TCMControlChange); message CM_ControlChange;

Implementering:

procedure TMyGroupBox.CMControlChange(var Message : TCMControlChange);
begin
inherited;
ShowMessage('CMControlChange');
if Message.Inserting then begin
// Flyt den komponent der blev droppet her
........
f.eks
if Message.Control.Left < fBorderWidth then
Message.Control.Left := BorderWidth + 2; // flyt den indenfor venstre side af rammen
end else Message.Result := Message.Result;
end;

Nu mangler jeg så bare lige at finde ud af hvad der skal ske hvis der flyttes på komponenten.

Jeg vidste at det var simpelt, men for f....... da hvor kan det bare tage lang tid at
finde løsningen.

Nååå Im off[Redigeret d. 27/02-03 14:04:06 af Stig Falck Hansen]


Hej,

AAhhhh, det var det du mente. Jeg troede at det var din "Caption" komponent som ikke måtte modtage komponenter.....men jeg kan forstå at du har lagt "Caption" på din GroupBox som en komponent....korrekt?

Hvis jeg har forstået dig korrekt ville det så ikke være nemmere at gøre din border størrer (højere i toppen) så der er plads til "Caption"?
Atlså du skal gøre dit client area mindre og selv tegner din border + caption.
På den måde er du sikker på at der ikke kan "droppes" nogle komponenter over din caption. Det er jo egentlig også sådan et vindue gør når du insætter en hovedmenu.

Nå, det var bare en idé (og selvfølgelig også for at fortælle at jeg misforstod ;0).
Mvh
Michael.




Jo det er bestemt en mulighed, som jeg vil overveje, men indtil videre
fungerer det som ønsket. Jeg har siden jeg skrev dette tilføjet nogle
Regions til komponenten. På den måde kan jeg finde ud af hvor andre
komponenter droppes og tilmed forhindre det.
Det er jo sådan set nogenlunde det samme som du har foreslået, så
jeg flytter lige nogle point til dig, som tak for dine svar.




t