Gå til innhold

visuelt lage en komponent uten å feste den på en form?


Anbefalte innlegg

hvordan jeg gjøre dette?

 

jeg vet jeg kan hardkode komponenten, men hvis jeg da vil forandre og ordne på den i design-modus, må den da tilhøre en form?

 

Har et program som skal hente noen TTabSheet komponenter fra en .dll og legge disse inn i en TPageControl i hovedprogrammet.. går dettE?

Lenke til kommentar
Videoannonse
Annonse
hvordan jeg gjøre dette?

 

jeg vet jeg kan hardkode komponenten, men hvis jeg da vil forandre og ordne på den i design-modus, må den da tilhøre en form?

 

Har et program som skal hente noen TTabSheet komponenter fra en .dll og legge disse inn i en TPageControl i hovedprogrammet.. går dettE?

 

Er litt usikker på hva du egentlig er ute etter, men hva med frames? Da kan du lage noen frames og legge disse i en dll.

 

Ellers er det også mulig å lage et vanlig vindu i en dll og deretter vise dette vinduet inni et annet vindu som om det skulle vært et panel om du forstår...

 

-Vegar

Lenke til kommentar

ja det hadde vært ålreit det siste du sa. lage en vanlig form i en .dll og vise den som et panel på hovedprogrammet. det hadde vært stilig.

er dette vanskelig å få til.

 

Det er dette eierskap som er vanskelig synes jeg. formen du lager i .dll filen må på en eller annen måte få hovedformen som owner?

Lenke til kommentar
ja det hadde vært ålreit det siste du sa. lage en vanlig form i en .dll og vise den som et panel på hovedprogrammet. det hadde vært stilig.

er dette vanskelig å få til.

 

Det er dette eierskap som er vanskelig synes jeg. formen du lager i .dll filen må på en eller annen måte få hovedformen som owner?

 

Det er ikke vanskelig i det hele tatt. Lag deg en dll-prosjekt. Opprett så en form i det prosjektet. Lag så en eksportfunksjon som returnerer formen. Her kan man jo velge om man ønsker å eksportere en instans av klassen, eller selve klassen. Forskjellen blir hvor du ønsker å opprette/frigjøre instansen. Dersom du ønsker å kunne opprette flere enn en instans er det nok lurest å returnere klassen.

 

Uansett. Her kommer et lite eksempel på en slik eksportfunksjon:

 

var

 form1: TForm1;



function GetDllForm: TCustomForm; export;

begin

 if not assigned(Form1) then

   Form1 := TForm1.Create(nil);

 result := Form1;

end;



exports

 GetDllForm;

 

Så må du ha kode i hovedprogrammet som kaller denne funksjonen og viser vinduet. Her kan det være lurt å sette noen properties på vinduet du vil vise slik at du får vekk captionbar osv.

 

Her er et lite eksempel:

 

procedure TForm2.Button1Click(Sender: TObject);

var

 h: hInst;

 GetFormProc: TGetFormProc;

 dllform: TCustomForm;

begin

h := LoadLibrary('dll.dll');

 GetFormProc := GetProcAddress(h, 'GetDllForm');

 dllForm := GetFormProc;

 if dllForm <> nil then

 begin

   dllForm.ParentWindow := Panel1.Handle;

   dllForm.Top := 5;

   dllForm.Left := 5;

   dllForm.Visible := true;

 end;

 FreeLibrary(h);

end;

 

Det burde få deg i gang. Men husk at jeg ikke har inkludert noe feiltesting osv. Ikke frigjør jeg vinduet noen gang heller.

 

Ta også en titt på http://www.ceberus.com/lmd/index.php3. De har en freeware utgave av komponentpakken sin - LMD-Tools SE - som inneholder bl.a. ett panel og en pagecontrol som kan vise frem forms.

 

-Vegar

Lenke til kommentar

Hei Format71 eller Vegar... :)

 

Jeg har gjort akkurat det du har beskrevet, men får det ikke til... :(

Her er koden min:

 

type

TGetFormProc = function: TCustomForm; stdcall;

 

procedure TForm1.Button1Click(Sender: TObject);

var

h: hInst;

GetFormProc: TGetFormProc;

dllForm: TCustomForm;

begin

h := LoadLibrary('min.dll');

GetFormProc := GetProcAddress(h, 'GetDLLForm');

dllForm := GetFormProc;

if dllForm <> nil then

begin

dllForm.ParentWindow := Panel1.Handle;

dllForm.Top := 5;

dllForm.Left := 5;

dllForm.Visible := True;

end;

FreeLibrary(h);

end;

 

Jeg får feilmelding Access violation at address 00000....

Dll'en er identisk som du har beskrevet.. med en form og samme funksjon.

 

Det hjelper ikke selv om det er statisk eller dynamisk kall av dll funkjonen.

 

Jeg og Dalai vil ha en hoved GUI som kaller dll'er ved nødvendighet for å integrere inn former(applikasjoner). Det som skjer er at det er et hoved unit(mainform) med hovedform. Også er det knapper.. dersom en trykker på en knapp så kaller den opp en dll som skal flette inn den sin form til hovedformen f.eks en tabsheet til en pagecontrol i hovedformen...

Så hver dll er en tabsheet som legges til hovedformen.. er du med.. :)

Takk for hjelpen i forveien...

 

-michael

Lenke til kommentar

Som sagt har jeg ingen feilsjekkingskode noe sted, så det må dere nesten legge på.

 

Det første dere må sjekke er at dll-fila blir funnet. Det sjekker dere ved å sjekke returverdien til LoadLibrary. Sjekk hjelpefila for beskrivelse, men jeg tror du kan sjekke på > 0.

 

Det neste er GetProcAddress(). Tror nok navnet på prosedyren du ønsker å få tak i er case-sensitivt. Sjekk at returverdien er <> nil.

 

Til slutt må du sjekke at du får tilbake en instans av formen. Der gjør du også ved å sjekke på nil. Eventuelt kan du bruke assigned( ).

 

Så det første er å finne ut på hvilken linje det krasjer. Dernest skulle det være greit å finne årsaken. Syns ikke dere skal gi opp så fort. Dette bør absolutt ikke være uoverkommelig. Skal jeg sende deg komplett eksempelkode?

 

-Vegar

Lenke til kommentar

Hei Vegar er du der?

 

Jeg lurte på om det er noe enkle måte å kunne gi keyboard støtte for former som er lagret i dll og er dokket på en kontroll av applikasjonen. :shrug:

 

(how to support the keyboard for forms that are stored in a DLL and are docked on a control of the application)

 

Mine former i en dll støtter f.eks. ikke tab knappen.. eller til å sette focus på en komponent... og jeg trenger spesielt tab funksjonaliteten.. :o

 

Mange takk i forveien..

 

mvh.

Michael

Lenke til kommentar

Vel tab funksjonaliteten fungere nå, men et nytt problem oppstår.. ?

 

Når jeg minimere hovedapplikasjonen så minimeres også dll formen, men innholdet i formen blir ikke minimert eller det jeg mener jeg har en dll form med en TWebBrowser -> alignemet:= alClient. Greit nok når vinduet er maskimalt full størrelse kan man få med scrollbars og innholdet, men dersom jeg minimere vinduet så blir srollbars borte og deler av siden er borte? Jeg må makismere vinduet får og kunne lese innhooldet.

 

Huff.. det er litt pess med dll former og Thandle og WinControl.. osv.

 

Prøvde det samme med en unit og en TwebBrowser uten docking av dll former.. da var alt iorden..

 

Har noen ideer eller hvorfor dette skjer... noen tips?

Noen prosjekter med samme problem? Eller har noen løst dette?

 

mvh.

michael

Lenke til kommentar

Jeg gjør følgende med formen før jeg setter parent:

 


       //Prepare

       SetWindowLong(FActiveForm.Handle, GWL_STYLE, WS_CHILD OR WS_CLIPSIBLINGS or WS_CLIPCHILDREN);

       SetWindowLong(FActiveForm.Handle, GWL_EXSTYLE, 0);

 

Hjelper det?

 

Ta en titt på lmd se sine komponenter for å vise forms inni andre forms.

 

-Vegar

Lenke til kommentar

nei det hjalp desverre ikke.. :cry: , men jeg skal ta å fordøye litt med SetWindowLong. SJekker lit om det og lære meg litt mer.. :woot:

 

Vi for se om vi klare det etterhvert... :D

 

Du får si ifra hvis du får til.. :roll:

 

Problem:

TWebBrowser på en dll form(align:=alClient). Åpner f.eks en web side www.vg.no på TwebBrowser. Alt er ok med docking til hovedapplikasjonen(på en mainpanel), tabfunksjonaliteten og fokus av enkelte komponenter fungere. Vi minimere applikasjonen... og vg siden(TWebBrowser) blir ikke minimert! Ingen scrollbars.. deler av siden blir borte!

 

takk for din interesse! :woot:

Lenke til kommentar

Hei igjen.

Jeg vil bare si at det jeg mene med minimere er ikke å legge ned applikasjonen i taskbar, men å resize/forminske formen->da mister jeg deler av vg siden, istedenfor at det skal komme opp scrollbars.

 

Det virker som om dll formen blir fastsatt punkter og størrelse uavhengig av parent som skal være TPanel->som igjen ligger under MainForm.

 

Så egentlig dersom man forminsker MainForm forminskes -> TPanel -> dll formen -> TwebBrowser.. medfører scrollbars i TWebBrowser. Sånn skulle det ha vært! :lol:

Lenke til kommentar

Det går selvsagt an å legge til slik at hovedformen ikke går an minimere(resize), og brukerene vil da ikke få den muligheten til å vite om feilen, men det er selvsagt litt svada opplegg....

 

Det skal kunne gå ann å lage noe lignende som IE. Eneste forskjellen er det som er under menybaren er docket inn av ulike dll former.

 

PS! Det er muligens jeg spør etter ditt(Format71) prosjekt snart og sjekke åssen du har gjort det med docking av dll former, men vil helst ikke det. Det er bedre med forklaringer eller snippets av koden. :)

 

mvh.

michael

Lenke til kommentar
PS! Det er muligens jeg spør etter ditt(Format71) prosjekt snart og sjekke åssen du har gjort det med docking av dll former, men vil helst ikke det. Det er bedre med forklaringer eller snippets av koden. :)

 

Jeg har privat ikke laget noe med forms i dll-file (bortsett fra et pittelite eksempel for å sjekke at det gikk i begynnelsen av denne tråen...) Det eneste jeg har gjort privat er å reprodusere en av komponentene fra lmd se, nemmelig en TCustompanel som kan vise andre forms. Har da også laget en stack slik at jeg kan pushe og poppe forms i dette panelet.

 

På jobb har vi en langt mer omfattende måte å gjøre ting på. Der har vi ett rammeverk og en bråte dll-filer. Dllfilene inneholder masse vinduer (lokasjoner som vi kaller dem) og disse vises frem i en 'lokasjonsviser' i rammeverket. Har der ingen problemer med resizeing o.l.

 

Å gi ut kildekoden til programmet på jobb kommer nok ikke på tale, men min lille komponent er ikke noe problem å vise frem. Har som sakt ikke prøvd den med forms fra dll-filer, men har du en peker til en form skulle det være samme hvor den pekeren kommer fra...

 

-Vegar

Lenke til kommentar

Selvsagt vil jeg ikke ha koder for hele prosjektet fra jobben din! Det er ulovlig det!!!

 

Men mere forklaringer og hjelp er jeg ute etter..

Forresten jeg har lastet ned lmd se, men det er for delphi6.0.

Jeg kjører delphi7.0... lmd se for delphi7.0? er det noe problemer med og bruker den gamle versjonen til delphi7.0?

 

Kunne du teste en ting for meg.. :) Det hadde vært kjempe snilt.

Test med den TCusomPanel som du pratet om og hent ned en dll form med en TWebBrowser i (align:=alClient). TwebBrowser henter f.eks. www.vg.no. Dette skal være grei...

 

Prøv deretter og resize formen. Sjekk om dll formen henger med... om den også resize's..

 

Mange takk..

 

michael

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...