[Delphi] 2 panels gelijk maken

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Is het mogelijk dat Panel1 gelijk wordt aan Panel2 run-time?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

Hoe bedoel je gelijk?
Gelijke grote? Moeten ze op elkaar lijken (dus qua componenten die OP het panel staan? Of bedoel je dat ze samen 1 panel worden? Dat eerste 2 is goed te doen..dat laatste waarschijnlijk ook wel als je het tweede panel in code aanmaakt en met pointers gaat rotzooien (humz.., panel2:=panel1 geeft dat geen error?)

Je kan 1 object kopieren door gebruik te maken van assign.
code:
1
panel2.assign(panel1)

Alle properties van panel1 worden gekopieerd naar panel2. Het zijn nog wel steeds 2 verschillende object..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op woensdag 31 oktober 2001 22:12 schreef Creepy het volgende:
Hoe bedoel je gelijk?
Gelijke grote? Moeten ze op elkaar lijken (dus qua componenten die OP het panel staan? Of bedoel je dat ze samen 1 panel worden? Dat eerste 2 is goed te doen..dat laatste waarschijnlijk ook wel als je het tweede panel in code aanmaakt en met pointers gaat rotzooien (humz.., panel2:=panel1 geeft dat geen error?)

Je kan 1 object kopieren door gebruik te maken van assign.
code:
1
panel2.assign(panel1)

Alle properties van panel1 worden gekopieerd naar panel2. Het zijn nog wel steeds 2 verschillende object..
Panel1 := Panel2; werkt niet.
Panel2.Assign(Panel1); werkt ook niet: hij kan niet een TPanel aan een TPanel assigen-en. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op woensdag 31 oktober 2001 22:15 schreef jelmervos het volgende:
Panel1 := Panel2; werkt niet.
Panel2.Assign(Panel1); werkt ook niet: hij kan niet een TPanel aan een TPanel assigen-en. :)
Ik heb geen flauw idee wat je aan het doen bent, maar het copieren van een panel met alle WinControls die dat panel als parent hebben doe je niet met 1 commando. :)
Components van Panel1 stuk voor stuk langslopen en copieren (en parent op Panel2 zetten), en de Components van die Components, etc..

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Wat ik wil is dat Panel1 gelijk wordt aan Panel2, dus de Caption, positie e.d. Ook de inhoud van de componenten, of is dit te veel gevraagd?
Misschien iets met pointers ofzo?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Caption, positie, enz. zijn gemakkelijk overgezet, maar de componenten hebben 2 eigenschappen die nogal in de weg zitten: hun Owner en hun Parent. Dat is niet met pointers op te lossen, maar je zult echt zelf copietjes van die componenten op Panel2 moeten zetten. En dan iets moeten verzinnen hoe je de properties onderling wilt synchroniseren...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Da's dus nog behoorlijk moeilijk. Jammer.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

En als je nu een procedure schrijft waar alles in zit
zoals :

Panel1.width := Panel2.width;
Panel1.left := Panel2.left;
Panel1.top := Panel2.top;
Panel1.caption := Panel2.caption;

Of is dit neit wat je zoekt ??

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Wat ik eigenlijk wil is dat een DLL een functie heeft die een panel terug geeft. De applicatie roept die functie aan en plaatst het panel vanuit de DLL op zijn form.
Of dit mogelijk is weet ik niet, probeer het nu.

Misschien weet iemand een betere oplossing?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op donderdag 01 november 2001 20:28 schreef jelmervos het volgende:
Misschien weet iemand een betere oplossing?
Nog geen ervaring mee, maar als je i.p.v. een Panel nou 's een Frame gebruikt?

  • JapJap
  • Registratie: Maart 2001
  • Laatst online: 07-01 11:02
As je nou gewoon een component maakt van die panel, kan je d'r runtime een paar aanmaken en op je form pleuren...

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 21:48
Waarom laat je die dll niet de panel maken met als parent window jou proggie? Of kan dat helemaal niet....?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

hmz.. object kopieren met assign gaat dus niet met panels.. blegh.. zal wel omdat een panel child controls kan bevatten..

Mar je wilt dus vanuit een DLL een panel aanmaken en tonen op het form van de aanroepende applicatie?
Als het allebei Delphi is (zowel de DLL als de aanroepende applicatie) kan je complete objecten als parameters en return values meegeven (humz.. DENK IK :) net zoals dat assign verhaal ff geen zin om Delphi op te starten en te zoeken)

Probeer eerst eens in code een panel aan te maken en toe te voegen aan je form (dus ZONDER dll). Probeer dan eens in een DLL of je een functie kan maken dat de handle van het form als parameter heeft, en dan dus dat panel daar op toont (deze oplossing werkt alleen als je applicatie EN dll allebei in Delphi zijn geschreven, anders moet je waarschijnlijk lekker gaan rotzooien met window handles en api call's)

ow ja.. community.borland.com -> search als je niet weet hoe je panels e.d. in code aan moet maken.. :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Ik heb hier thuis op het moment Borland niet geinstalleerd staan, dus kan het niet verifieren, maar volgens mij kun je het standaard streammechanisme dat iedere TWinControl derivant (en dus TPanel ook) heeft misbruiken: stream het ding naar een TMemoryStream, geef die terug (desnoods als void* of andere binary blob), en laat de caller 'm zelf unstreamen op een TWinControl naar keuze.

Professionele website nodig?


Verwijderd

JapJap en Jelmer, dat kan allebei. Daarvoor hebben ze bij Borland die TFrames uitgevonden. :)

  • Mr.Nobody
  • Registratie: Oktober 2001
  • Niet online
het is een beetje zielige code, maar goed het werkt wel :?

zet 2 panels op een form, gooi in panel1 een label en een button en koppel de code hieronder aan een button. je moet het lijstje onderaan aanvullen met de comps die jij wilt gebruiken.


procedure TForm1.Button1Click(Sender: TObject);
var
temp : tcomponent;
I: Integer;

begin


for I := ComponentCount - 1 downto 0 do
begin
Temp := Components[I];
if temp.GetParentComponent = panel1 then
begin
clipBoard.setComponent(temp);
clipBoard.getComponent(form1, panel2);
end;
end;
end;


initialization
RegisterClasses([TButton]);
RegisterClasses([TLabel]);
end.

Opensource delphi componenten (http://www.delphi-jedi.org)


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oke, veel reply's, bedankt! Maar wat is nu de beste oplossing om een Panel (Frame?) uit een DLL naar een applicatie te gooien? Dus dat de DLL een Panel/Frame opmaakt en de applicatie hem toont.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 21:15

Delphi32

Heading for the gates of Eden

Op vrijdag 02 november 2001 00:18 schreef jelmervos het volgende:
Oke, veel reply's, bedankt! Maar wat is nu de beste oplossing om een Panel (Frame?) uit een DLL naar een applicatie te gooien? Dus dat de DLL een Panel/Frame opmaakt en de applicatie hem toont.
Ik begrijp helaas nog steeds niet precies wat je bedoelt. Maar ik kan je wel vertellen dat het doorsturen van een in een DLL gemaakt panel naar een TForm in de .exe niet zomaar gaat, omdat pointers niet overdraagbaar zijn van DLL naar exe.

Als ik het goed begrijp, wil je dat een extern iets (een DLL in jouw woorden) een panel voor je opmaakt. Mijn advies is dan: ga eens kijken wat je met packages kan. Pointers naar bv panels zijn in packages wel overdraagbaar namelijk. Je kunt dan een package maken met daarin een function CopyPanel (aPanel: TPanel): TPanel die dan de copy voor je uitvoert.

Maar ik acht de mogelijkheid van werken met TFrames ook niet helemaal heilloos. Waarom moet het in een DLL, eigenlijk?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op vrijdag 02 november 2001 00:18 schreef jelmervos het volgende:
Oke, veel reply's, bedankt! Maar wat is nu de beste oplossing om een Panel (Frame?) uit een DLL naar een applicatie te gooien? Dus dat de DLL een Panel/Frame opmaakt en de applicatie hem toont.
Daar je blijkbaar te lui bent om mijn suggestie na te lezen heb ik het maar even voor je gedaan (heb hier wel Borland op m'n werk).

Je maakt in de DLL de Panel aan met als Owner de global Application. Vervolgens maak je een TWriter tegen een TMemoryStream aan met in de Root-property je Panel. De binary blob uit die TMemoryStream pleur je naar de caller toe, die 'm met een TReader kan uitgenereren.

Je zult er wat meer leeswerk op moeten verrichten (er zijn o.a. globale functies om het proces te automatiseren), maar dit moet perfect kunnen werken.

Professionele website nodig?


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Bedankt voor je hulp. Zal er dit weekend even mee aan de gang.

Cartman, waar blijf je???

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1