[delphi] meerdere forms in 1 form

Pagina: 1
Acties:

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ik wil het volgende bereiken.

Ik heb een mainform waar mensen in kunnen loggen, vanuit daar worden ze naar andere forms gestuurd en komen er andere dingen in beeld. (keuze menus, etc.)

Nu vind ik dat werken met verschillende forms een beetje onhandig, omdat ik telkens alle form instellingen moet overzetten naar een nieuw form, etc.

Nou las ik ergens dat dit ook makkelijk met TPanels te doen zou zijn, zodat ik maar 1 form heb, met verschillende Panels daarop. En dat ik daar tussen kan switchen.
Dit zou een uitkomst voor me zijn, zodat de gebruiker maar 1 form tezien krijgt en alleen de 'inhoud' van het form switched.

Alleen ben ik hier een beetje mee aan het spelen, maar ik vraag me af of dit echt DE manier is om zo'n form-applicatie te schrijven. Of zijn er betere manieren om ziets op te pikken?

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 05-05 10:41

Bergen

Spellingscontroleur

Je kunt 't ook met tabbladen doen...

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Zoek eens op MDI en het gebruik van frames binnen Delphi :), verder heb je ook nog de tabcontrol en pagecontrol om iets met tabbladen te doen. Persoonlijk gebruik ik die oplossing vaak, alles blijft netjes gegroepeerd en je hoeft niet moeilijk te doen met het doorgeven van gegevens tussen verschillende formulieren.

Sole survivor of the Chicxulub asteroid impact.


  • kippy
  • Registratie: September 2004
  • Laatst online: 00:41
Je zou ook alles op 1 form kunnen maken zonder tabbladen en dan de dingen je die je op een bepaald mement wil laten zien (showen) en dingen die je niet wil laten zien (hiden)

Het is een idee en hebruik het zelf soms, maar met tabbladen is het wel iets makkelijker.

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 01-04 11:43

koli-man

Bartender!!!!

kippy schreef op dinsdag 15 maart 2005 @ 12:45:
Je zou ook alles op 1 form kunnen maken zonder tabbladen en dan de dingen je die je op een bepaald mement wil laten zien (showen) en dingen die je niet wil laten zien (hiden)

Het is een idee en hebruik het zelf soms, maar met tabbladen is het wel iets makkelijker.
Dit is met het aanmaken en wijzigen van een GUI niet echt aan te raden en eerder dus af te raden. Want als je die gui 2 weken niet ziet en je moet dan een wijziging doorvoeren.....daar wordt je absoluut niet vrolijk van.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Vroeger gebruikte ik daar Frames voor in Delphi. In je hoofdscherm houd je een variabele bij van het type frame, waarin je dan dynamisch frames laadt. Je kunt in de gaten houden wat de status is en of er op dat moment een frame openstaat.

Meer info in dit topic

My personal website


Verwijderd

Je kunt natuurlijk ook gebruik maken van een TPageControl, maar of je daarmee ook de tabbalk kunt uitzetten weet ik zo snel niet, maar daar kun je ook diverse pagina's mee gebruiken.

[ Voor 3% gewijzigd door Verwijderd op 16-03-2005 11:03 ]


Verwijderd

Je kan ook een eigen subclass van TForm maken waar je een paar functies in bouwt om instellingen te laden of te kopieren. TForm::Create overloaden doet t meestal wel aardig :+ .

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op woensdag 16 maart 2005 @ 10:27:
Je kunt natuurlijk ook gebruik maken van een TPageControl, maar of je daarmee ook de tabbalk kunt uitzetten weet ik zo snel niet, maar daar kun je ook diverse pagina's mee gebruiken.
Dat gaat prima. Per tabblad de tabvisible op false en niemand die ziet dat er een TPageControl wordt gebruikt. Naar mijn idee ideaal om binnen 1 form van "form" te wisselen ;)
En m.b.v. de TPageControl.ActivePage of TPageControl.ActiveIndex kan je dan van tabblad wisselen.

"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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:37

Tomatoman

Fulltime prutser

Frames hebben mijn voorkeur, omdat je dan in een later stadium heel eenvoudig de layout nog kunt wijzigen. Met tabbladen in een TPageControl gaat dat veel lastiger. Met frames kun je ook relatief eenvoudig docking implementeren.

Frames hebben nog een ander belangrijk voordeel, namelijk dat ieder frame in een aparte unit wordt geïmplementeerd. Daardoor wordt de code die bij een bepaald frame hoort netjes gescheiden van de unit die bij je main form hoort. Je code blijft daardoor overzichtelijker en beter gestructureerd.

Een goede grap mag vrienden kosten.


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
tomatoman schreef op woensdag 16 maart 2005 @ 13:19:
Frames hebben mijn voorkeur, omdat je dan in een later stadium heel eenvoudig de layout nog kunt wijzigen. Met tabbladen in een TPageControl gaat dat veel lastiger. Met frames kun je ook relatief eenvoudig docking implementeren.

Frames hebben nog een ander belangrijk voordeel, namelijk dat ieder frame in een aparte unit wordt geïmplementeerd. Daardoor wordt de code die bij een bepaald frame hoort netjes gescheiden van de unit die bij je main form hoort. Je code blijft daardoor overzichtelijker en beter gestructureerd.
Ok, dus je bedoelt elk los form wat ik eigenlijk zou maken in een losse frame zetten?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Rodyman schreef op maandag 11 april 2005 @ 13:34:
[...]

Ok, dus je bedoelt elk los form wat ik eigenlijk zou maken in een losse frame zetten?
Ik denk dat jij het begrijpt :)

日本!🎌


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
haha ok :) ik heb het net eens geprobeerd, en het ziet er inderdaad veelbelovend uit! :)

Bedankt allemaal!

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok laatste vraag, ik heb nu vanmiddag lekker allemaal frames zitten maken :) Maar hoe krijg ik die nu goed geshowed.

Wat ik nu dus heb, is één form met een TFrame erop. Maar hoe krijg ik nou mijn nieuw gemaakte frame gekoppeld aan dit frame in run-time.

Ik heb vanalles geprobeerd, maar ik blijf maar access violations of class not found errors krijgen. Weet iemand misschien een goed voorbeeldje anders?

Ik neem aan dat ik in eerste instantie in de formCreate het eerste frame moet aanroepen? Maar hoe gaat dit in zijn werk?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je kan ze wederom allemaal al designtime op een TPageControl zetten. Anders deze code gebruiken om m runtime aan te maken
Delphi:
1
2
3
4
5
6
var MijnFrame: TMijnFrame;
begin
  MijnFrame := TMijnFrame.Create(Self);
  MijnFrame.Parent := Self; // of een panel ipv Self ofzo
  MijnFrame.Align := alClient; // of stel de top, left, width en height in
end;

[ Voor 4% gewijzigd door LordLarry op 11-04-2005 19:05 ]

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:37

Tomatoman

Fulltime prutser

LordLarry schreef op maandag 11 april 2005 @ 18:52:
Je kan ze wederom allemaal al designtime op een TPageControl zetten. Anders deze code gebruiken om m runtime aan te maken
Delphi:
1
2
3
4
5
6
var MijnFrame: TMijnFrame;
begin
  MijnFrame := TMijnFrame.Create(Self);
  MijnFrame.Parent := Self; // of een panel ipv Self ofzo
  MijnFrame.Align := alClient; // of stel de top, left, width en height in
end;
Het kan zijn dat je hier nog Visible := True aan toe moet voegen.

Een goede grap mag vrienden kosten.


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok, vanavond even proberen, zit nu op m'n werk!

  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
Misschien heb je wat aan de manier waarop ik met een pagecontrol met frames werk. Ik heb een Frame ontworpen dat zijn eigen tabsheet aanmaakt en wordt geplaatst op een PageControl, op deze manier ontwerp ik de verschillende schermen die te zien moeten zijn op een afgeleide van het ontworpen frame (in mijn geval TPageFrame).

Ik heb ook een nieuw component MenuButton die een aantal dingen bepaalt (oa. de pageframe), deze wordt meegegeven bij de constructor ipv de owner, die wordt gevonden in de property pagecontrol.

Dit staat in de constructor die ik gebruik
code:
1
2
3
4
5
6
      FPageControl:=AMenuButton.PageControl;
      FPage:=TTabSheet.Create(FPageControl);          //Page aanmaken aanmaken
      FPage.PageControl:=FPageControl;
      FPageControl.ActivePage:=FPage;
      create(FPage);                                  //Frame aanmaken
      Parent:=Fpage;

Eerlijk gezegd weet ik niet of het wel helemaal netjes is om de owner van de componenten op deze manier te gebruiken (de owner van het frame wordt hier ook gecreëerd) maar het werkt wel heel lekker.

Bij mij wordt op de pagecontrol gewoon aangegeven welke TabSheets (frames dus) open zijn, ik geef daarop relevante info weer over het getoonde frame.

Op deze manier kun je je bij het maken van een nieuw scherm concentreren op dat scherm alleen zonder allerlei andere dingen.

Ik hoop dat je een eindje op weg komt hiermee.

[ Voor 5% gewijzigd door ReallyStupidGuy op 12-04-2005 16:25 ]

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok ik ben er nu een heel eind, maar nog niet helemaal.

Ik wil de pagecontrol even buiten beschouwing laten, en wil ze dynamisch opbouwen.

ik heb het volgende in het hoofd form staan:

code:
1
2
3
4
5
6
7
8
9
10
var
  frm_Main: Tfrm_Main;
  fraMain: TFrame;

procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  fraMain:= TfraInlog.Create(Self);
  fraMain.Parent := self;
  fraMain.Align := alClient;
end;


Er is dus een frame (fraMain) wat bij de creatie gemaakt wordt en gevuld wordt met een TfraInlog. Dit werkt allemaal prima.

Nu wil ik naar het volgende frame en roep ik de volgende functie aan:

code:
1
2
3
4
5
6
procedure TfraInlog.showManagementMenu();
begin
  fraMenuManagement.Create(frm_Main);
  fraMenuManagement.Parent := frm_main;
  fraMenuManagement.Align := alClient;
end;


Maar hier krijg ik een access violation op. Ik heb geprobeerd om het inlog frame eerst te '.free'-en maar dit helpt niets. Ik zie niet helemaal wat er nou precies fout gaat. Waarschijnlijk kijk ik over iets kleins heen, terwijl ik er heel dicht bij ben.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je hebt niet helemaal goed gekeken naar mijn voorbeeld code. Zo creeer je geen classes. Zo doe je dat:
Delphi:
1
2
3
4
5
6
procedure TfraInlog.showManagementMenu();
begin
  fraMenuManagement := TfraMenuManagement.Create(frm_Main);
  fraMenuManagement.Parent := frm_main;
  fraMenuManagement.Align := alClient;
end;


Zie ook http://www.delphibasics.co.uk/Article.asp?Name=OO

We adore chaos because we like to restore order - M.C. Escher


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
damn zo stom.. en daar kijk je dan de hele avond overheen! Dank je wel nogmaals!

  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Ok, ik heb het nu werkend, maar soms als ik naar het eerste frame terugswitch, treed er een abstract error of een access violation error op. Maar ik kan niet zien waar deze vandaan komt (kom in de cpu asm code uit zegmaar via de debugger).

Ik denk dat het iets te maken heeft met het aanroepen van het eerste frame.
Dit doe ik alsvolgt:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  Tfrm_Main = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    fraMain: TFrame;
  end;

var
  frm_Main: Tfrm_Main;

implementation
{$R *.dfm}

procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  FreeAndNil(frm_Main.fraMain);

  fraMain := TfraInlog.Create(nil);
  fraMain.Parent := self;
  fraMain.Align := alClient;
end;


waarbij fraMain het frame is wat steeds opnieuw gecreerd wordt.

[ Voor 5% gewijzigd door Rodyman op 18-04-2005 11:08 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ben je dan ook frames en/of tabsheets aan het verwijderen/vrijgeven? Zie dan hier of hier.

We adore chaos because we like to restore order - M.C. Escher


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
Het is inderdaad niet alleen bij het eerste frame zie ik nu. Die abstract error treed bij andere schermen ook op.
Het probleem is volgens mij inderdaad dat je dus schijnbaar op een frame geen knop kunt zetten die een nieuwe frame opent en de oude 'weggooit'.
Is dit niet anders op te lossen als met zo'n 'message' zegmaar?

  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
code:
1
2
3
4
5
6
7
8
9
10
11
procedure TPageFrameSource.Close;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
                      //Sluite van deze FramePage, een FramePage
end;


procedure TPageFrameSource.CMRelease(var Message: TMessage);
begin
  main.MainForm.DeletePage;
end;

Maar dit schijnt niet netjes te zijn :P

Zo heb ik het opgelost, kreeg anders ook een abstract error idd. Via een windows handle werkt het dus wel.

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


  • Rodyman
  • Registratie: November 2001
  • Laatst online: 08-06-2024
zo heb ik het nu dus ook werkend.. maareh, is er echt geen nettere oplossing voor zoiets? zal toch wel?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nope.

We adore chaos because we like to restore order - M.C. Escher


  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
Rodyman schreef op maandag 18 april 2005 @ 15:21:
zo heb ik het nu dus ook werkend.. maareh, is er echt geen nettere oplossing voor zoiets? zal toch wel?
Ik heb zelf eens geprobeerd altijd een "closebutton" rechtsboven in mn frame te hebben door een knop op mn mainform op die plek te plaatsen. Daardoor lijkt het ook net of de knop bij het frame hoort maar eigenlijk staat de knop op het mainform. Die kan dan gewoon zorgen dat het frame sluit.

Daar ben ik trouwens vanaf gestapt omdat het plaatsen makkelijker is als de knop echt op het frame staat(gewoon uitlijnen).

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.

Pagina: 1