CT.7.10 + Windows 10.
Hoe kan ik de Size v.d. Font vergroten, enkel v.d. "DBGrid", als de Form = Maximized en de Size terug op normaal zetten als de Form op Normal wordt gezet.
CT.7.10 + Windows 10.
Hoe kan ik de Size v.d. Font vergroten, enkel v.d. "DBGrid", als de Form = Maximized en de Size terug op normaal zetten als de Form op Normal wordt gezet.
Hallo,
Misschien kan je onderstaand idee gebruiken.
Met een vriendelijke groet, Frans
Code:unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormWindowStateChange(Sender: TObject); private public end; var Form1: TForm1; implementation var W,H : Integer; Size : Integer; {$R *.lfm} PROCEDURE TForm1.FormResize(Sender: TObject); BEGIN IF (Width > W) or (Height > H) THEN Inc(Size) ELSE Dec(Size); IF Size < 10 THEN Size := 10; // Begrenzing letter hoogte mininmaal IF Size > 32 THEN Size := 32; // Begrenzing letter hoogte maxinmaal Font.Size := Size; W := Width; H := Height; Invalidate; END; PROCEDURE TForm1.FormWindowStateChange(Sender: TObject); BEGIN IF WindowState = wsMaximized THEN Size := 99 ELSE Size := 0; FormResize(nil); END; PROCEDURE TForm1.FormCreate(Sender: TObject); BEGIN Size := 10; W := Width; H := Height; Font.Size := 10; END; end.
Dank voor de reply.
Blijkbaar doe ik iets fout !!!
Heb wel de variable aangepast met een 'F' vooraan.
FSize
FW
FH
De fontsize wordt niet aangepast bij "wsMaximized".
De compiler geeft geen fouten en de applicatie werkt zoals voorheen.
Hier mijn code:
Code:procedure TFMAIN.FormCreate(Sender: TObject); begin // *** NL-DELPHI FSize := 10; FW := Width; FH := Height; Font.Size := 10; // *** NL-DELPHI // De Aligment voor "Title.Captions" in de DBGrid1. DBGrid1.Columns[0].Title.Alignment:= taCenter; DBGrid1.Columns[0].Title.Font.Color:= clRED; DBGrid1.Columns[0].Title.Font.Style:= [fsBold]; DBGrid1.Columns[2].Title.Alignment:= taCenter; DBGrid1.Columns[2].Title.Font.Color:= clRED; DBGrid1.Columns[2].Title.Font.Style:= [fsBold]; // "defaultFormatSettings" moet voor "ShortDateFormat". defaultFormatSettings.ShortDateFormat:='DD/MM/YYYY'; defaultFormatSettings.DateSeparator:= '/'; // PanelPlaatjeGROOT op de juiste plaats zetten in de juiste grootte. FMAIN.ClientWidth := DBGrid1.Left + DBGrid1.Width; FDATA.SQLQuery1.UpdateMode := upWhereKeyOnly; FDATA.SQLQuery1.active := True; // DBGrid1.SetFocus; // <-- this can't be done in FormCreate Self.ActiveControl := DBGrid1; // <-- this can be done in FormCreate // de 2 comboboxen opvullen met de gegevens uit de 2 txt bestanden. //CBoxPCODE.Items.LoadFromFile('DBPCODE.txt'); // de 2 velden v.d. dbgrid opvullen met de gegevens uit de 2 txt bestanden // in de vorm van dropdown. DBGrid1.Columns[2].PickList.LoadFromFile('DBPCODE.txt'); DBGrid1.DragMode := dmAutomatic; // RecordsFound; // speciale proc. Aantal records in DB: // Initialize width for each column. DBGrid1.Columns.Items[0].Width := 330; // NAAM DBGrid1.Columns.Items[1].Width := 330; // ADRES DBGrid1.Columns.Items[2].Width := 330; // PCODE DBGrid1.Columns.Items[3].Width := 100; // HOMETEL DBGrid1.Columns.Items[4].Width := 110; // GSMTEL DBGrid1.Columns.Items[5].Width := 200; // EMAIL DBGrid1.Columns.Items[6].Width := 100; // GDATUM DBGrid1.Columns.Items[7].Width := 330; // INFO Application.ProcessMessages; end; procedure TFMAIN.FormResize(Sender: TObject); begin //showmessage('Resize'); // *** NL-DELPHI IF (Width > FW) or (Height > FH) THEN Inc(FSize) ELSE Dec(FSize); IF FSize < 10 THEN FSize := 10; // Begrenzing letter hoogte mininmaal IF FSize > 32 THEN FSize := 32; // Begrenzing letter hoogte maxinmaal Font.Size := FSize; FW := Width; FH := Height; Invalidate; // *** NL-DELPHI end; procedure TFMAIN.FormWindowStateChange(Sender: TObject); begin if (Self.WindowState = wsMaximized) then begin //showmessage('onwindowstatechange'); DBGrid1.Width:= PanelDBGrid.Width -1; DBGrid1.Height:= PanelDBGrid.Height; PanelNavigator.Width:= PanelZoek.ClientWidth -10; Application.processmessages; end; // *** NL-DELPHI IF WindowState = wsMaximized THEN FSize := 99 ELSE FSize := 0; FormResize(nil); // *** NL-DELPHI end;
Dit werkt bij mij gewoon (met een TStringGrid):
Delphi Code:
procedure TForm1.FormWindowStateChange(Sender: TObject); begin writeln('FormWindowStateChange: WindowState=',WindowState); case WindowState of wsMaximized: StringGrid1.Font.Size := 18; wsNormal: StringGrid1.Font.Size := 8; wsMinimized: {StringGrid1.Font.Size := 1}; //do nothing end; end;
Bart
Sorry Bart, maar jouw laatste code helpt niet.
Heb de naam 'stringgrid' natuurlijk aangepast naar 'dbgrid'.
Bedankt voor de moeite.
Waarschijnlijk zitten de professionele 'DBGrid' programmeurs tijdens de kerst op een zonnig eiland!
De diverse showmessages komen te voorschijn.
Sorry, maar 'debuggen' is niets voor mij !
In Attachments zit mijn hoofdunit.
umain.pas
Code:var FMAIN: TFMAIN; FW,FH : Integer; FSize : Integer; implementation .... procedure TFMAIN.FormResize(Sender: TObject); begin //showmessage('Resize'); // *** NL-DELPHI showmessage('1 - FormResize'); IF (Width > FW) or (Height > FH) THEN Inc(FSize) ELSE Dec(FSize); IF FSize < 10 THEN FSize := 10; // Begrenzing letter hoogte mininmaal IF FSize > 32 THEN FSize := 32; // Begrenzing letter hoogte maxinmaal Font.Size := FSize; FW := Width; FH := Height; Invalidate; // *** NL-DELPHI end; //********************************************************************* procedure TFMAIN.FormWindowStateChange(Sender: TObject); begin if (Self.WindowState = wsMaximized) then begin showmessage('1 - Fonwindowstatechange'); DBGrid1.Width:= PanelDBGrid.Width -1; DBGrid1.Height:= PanelDBGrid.Height; PanelNavigator.Width:= PanelZoek.ClientWidth -10; Application.processmessages; end; // *** NL-DELPHI IF WindowState = wsMaximized then begin showmessage('2 - FormWindowStateChange'); FSize := 99; end else begin showmessage('3- FormWindowStateChange'); FSize := 0; end; FormResize(nil); // *** NL-DELPHI end;
Je zet wel FSize, maar nergens (in FormResize) de Font.Size van het Grid.
Ik zou dit overigens niet in OnResize afhandelen.
Dit event wordt namelijk meerdere keren afgevuurd als je het form van grootte veranderd.
Stel je form is bijna maximaal, nu verklein je het form en binnen enkele stapjes is je font size je gedefinieerde minimum grootte.
Stel je form is erg klein (50x*50 pixels bijvoorbeel), nu vergroot je het form en binnen enkele stapjes is je font size je gedefinieerde maximum grootte.
Dat lijkt me niet wat je wilt.
Ik kan me 2 dingen voorstellen die je wilt bereiken:
Ofwel de font.size groeit proportioneel met de form grootte,
of je hebt een font.size voor wsMaximized en een andere font.size voor niet wsMaximized.
Hier is een voorbeeld van de eerste optie:
Delphi Code:
procedure TForm1.FormResize(Sender: TObject); begin if IsConsole then writeln('FormResize'); Case Width of 0..400: StringGrid1.Font.Size := 8; 401..800: StringGrid1.Font.Size := 10; 801..1200: StringGrid1.Font.Size := 12; Otherwise StringGrid1.Font.Size := 14; end; end;
Nog een opmerking: in OnCreate zet je de font size van je form.
Dit heeft alleen effect op het grid als ParentFont van het grid op True staat (dat is de default waarde overigens).
Verder zie ik dat je ook panels en grids van grootte veranderd bij het re-sizen.
Dat is een beetje "old school", je kunt beter Anchors gebruiken hiervoor, die stel je in in de OI en (als je het goed doet) groeien de controls mee met het form.
Bart
Last edited by Bart B; 26-Dec-20 at 16:46.
Kleine modificatie (oogt net iets netter):
Delphi Code:
procedure TForm1.FormResize(Sender: TObject); var Area: Integer; begin if IsConsole then writeln('FormResize'); Area := Width*Height; Case Area of 0..640*480: StringGrid1.Font.Size := 8; 640*480+1..800*600: StringGrid1.Font.Size := 10; 800*600+1..1024*768: StringGrid1.Font.Size := 12; Otherwise StringGrid1.Font.Size := 14; end; end;
Bart
Bart,
Jouw code maakt geen verschil in de font.size.
Wat ik zoek is een DBGrid font.size voor wsMaximized en een andere font.size voor 'niet' wsMaximized.Code:procedure TFMAIN.FormResize(Sender: TObject); var Area: Integer; begin //showmessage('Resize'); if IsConsole then writeln('FormResize'); Area := Width*Height; Case Area of 0..640*480: DBGrid1.Font.Size := 8; 640*480+1..800*600: DBGrid1.Font.Size := 10; 800*600+1..1024*768: DBGrid1.Font.Size := 12; Otherwise DBGrid1.Font.Size := 14; end;
De resolutie v.h. scherm zou geen rol mogen spelen.
Heb namelijk een groot scherm 27" wat een Maximized kan gebruiken voor deze applicatie, maar dan wel met aangepaste font.size van 18.
Leo
Dan zou mijn code uit post #4 moeten werken.
Bij mij werkt het (Lazarus trunk, fpc 3.2.0).
Geen idee waarom het bij jou niet werkt.
Nogmaals: in mijn voorbeeld (#4) heb je geen OnResize nodig, en bovendien jouw OnResize doet niet wat jij denkt dat het doet.
Zie bijgevoegd test project.
Bart
Bedankt Bart voor de 'zip'.
Inderdaad, jouw voorbeeld programma werkt, maar het gaat nog altijd over een STRINGGRID en niet een DBGrid.
Blijkbaar zit er een groot verschil tussen beiden qua aanpassing van de font.
Misschien kan jij het met een DBGrid uittesten ???
Indien je weinig tijd hebt, laat deze zaak dan maar vallen.
Jouw steun was al prima.
geen idee hoe CT werkt maar de makkelijkste test om te kijken of eea werkt is gewoon een button plaatsen op het scherm en in de onclick de font van de dbgrid aanpassen. Als dat werkt dat is weet je zeker dat het kan.
Als je eigen code dan niet werkt dat weet je zeker dat de plek waar je eea hebt geprogrammeerd niet de correcte plek is en dat bijv het resize van de dbgrid de gekozen font overrules.
Overigens is het zo dat als je alleen de font van de dbgrid (of welke willekeurig control) wilt aanpassen cq aanpast dat dan zoals eerder gemeld de "parentfont" van true naar false gaat! Na het veranderen van dbgrid font zal dbgrid font dus niet meer de form font volgen!
Dit kan je met twee buttons op het scherm snel testen
button1
button2Code:dbgrid1.Font.Size:=Font.Size+5;
klik een paar maal op button2 en het font van dbgrid volgt het form font (als parentfont aan staat) zodra je echter button1 1 maal geklikt hebt zal dat niet meer gebeurenCode:font.size := font.size+5;
Beiden hebben een font property, als het onmogelijk is om die te zetten, dan is dat een bug.
Test dat zoals Miep aangeeft, werkt het niet dan is er iets mis.
Een DbGrid ontleent zijn inhoud (de tekst dus) aan zijn datasource.
Dus heb je een database nodig om het grid te vullen, die heb ik zo even niet voorhanden, dus mijn DbGrid is altijd leeg (en het testen van het font dus vrij zinloos).
Bart
OK, net even getest met een CsvDataset.
Het font veranderen van een DbGrid gaat prima, niet anders dan van een TStringGrid.
Conclusie: of jij doet iets fout, of CT doet iets fout.
Bart
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks