Autor Téma: Zmena veľkosti formulára - veľké oneskorenie  (Přečteno 935 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
Zmena veľkosti formulára - veľké oneskorenie
« kdy: 02-07-2019, 19:52:57 »
S tým problémom nie som sám.
Napadlo mi počas zmeny veľkosti formulára potlačiť vykresľovanie (a prepočítavanie) jeho obsahu. Najprv som si myslel, že bude vhodná udalosť OnResize. Problém je v tom, že
  • sa volá opakovane a
  • hlavne neviem odchytiť koniec ťahania
Druhá možnosť by snáď mohla byť OnMouseDown + OnMouseUp spojených s ťahaním okraja a jeho ukončením. Žiaľ v udalostiach OS sa nevyznám. Bez nich to asi nepôjde. Som presvedčený, že sa prepočítavajú aj komponenty ktoré nie je vidieť. Ináč by to nemohlo mať takú dlhú odozvu.
Ako sa to vlastne rieši?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Zmena veľkosti formulára - veľké oneskorenie
« Odpověď #1 kdy: 02-07-2019, 20:39:50 »
Skúšal som to urobiť natvrdo vo FormCreate. Jediné čo zabralo bolo nastaviť
Kód: Delphi [Vybrat]
  1.  MyAdvOfficePager.Visible := False;
Zrovna tak som si to nepredstavoval.
Ten istý problém je aj pri zložitejšom TAdvToolBarPager. Tu neprichádza do úvahy skryť ho.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 519
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Zmena veľkosti formulára - veľké oneskorenie
« Odpověď #2 kdy: 02-07-2019, 22:11:10 »
Pro par tipu viz. vlakno How can I make my form resize more smoothly?
Vyskúšané:
WMExitSizeMove, WMExitSizeMove z odkazu určite nepomôžu.
Je fakt, že zabrzdia vykresľovanie ( teda aj TAdvOfficePager ), lenže efekt je neprípustný.
Obsah okna sa nezmení počas Form Resize, to je fakt. Takže ani nebliká :) Ale vyzerá to ozaj zle >:(
Mal som to a už aj vyhodil preč. Kód pre záujemcov:
Kód: Delphi [Vybrat]
  1.   uses
  2.     .. Winapi.Messages, ..
  3.   protected
  4.     procedure WMEnterSizeMove(var MsgSizeMove: TWMMove ); message WM_ENTERSIZEMOVE;
  5.     procedure WMExitSizeMove(var MsgSizeMove: TWMMove ); message WM_EXITSIZEMOVE;
  6.   public
  7.   end;
  8. var
  9.    FrmMain        : TFrmMain;
  10. implementation
  11. ..
  12. procedure TFrmMain.WMEnterSizeMove(var MsgSizeMove: TWMMove);
  13. begin
  14.   Self.DisableAlign;
  15. end;
  16. //---
  17. procedure TFrmMain.WMExitSizeMove( var MsgSizeMove: TWMMove );
  18. begin
  19.   Self.EnableAlign;
  20. end;
S tým kódom je možné robiť veľmi vtipné veci. Našiel som zdroják z roku 2016, kde som to využil.
Ale nie je vhodné, pre tento prípad.

DeferWindowPos z odkazu, som zatiaľ netestoval..
« Poslední změna: 02-07-2019, 22:13:54 od miroB »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Zmena veľkosti formulára - veľké oneskorenie
« Odpověď #3 kdy: 02-07-2019, 22:40:49 »
Kontaktujte support TMS. Zni to jako problem v jejich implementaci kreslicich cyklu.
Asi nám iné neostane. Problém je v tom, ako si písal, že majú vlastné vykresľovanie. Nemáme šancu s tým niečo urobiť.
Skúsil som toto
Kód: Delphi [Vybrat]
  1. procedure TfrmFormMain.FormResize(Sender: TObject);
  2. begin
  3.   Self.DisableAlign;
  4. offpgrPobes.Visible := False;
  5. end;
  6. procedure TfrmFormMain.tmr1Timer(Sender: TObject);
  7. begin
  8.   Self.EnableAlign;
  9. offpgrPobes.Visible := True;
  10. offpgrPobes.Width := Self.ClientWidth;
  11. end;
Je sranda pozorovať ako sa to správa.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4426
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Zmena veľkosti formulára - veľké oneskorenie
« Odpověď #4 kdy: 02-07-2019, 22:43:12 »
Tu poprosím miraB o napísanie na podporu. Len preto, lebo neviem po anglicky. A toto by som ťažko opísal. Pokojne sa môže na mňa odvolať. V poslednej dobe som si trochu s nimi pokecal.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 519
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Zmena veľkosti formulára - veľké oneskorenie
« Odpověď #5 kdy: 03-07-2019, 00:20:19 »
Tak som spravil pár vecí:
  • všetko, čo šlo som dal na DoubleBuffered. Bez toho to bola katastrofa
  • Na každej strane/záložke som všetky komponenty strčil na TPanel. Ten na báze eventu onChanging upravím Visible:=False. Dúfam, že tak sa zbytočne nevykresľujú všetky komponenty, keď nie sú visible..
  • Pretože mám pocit, že AdvOfficePager vykresľuje
      • príšerne spomalene, oproti iným komponentom
      • všetko, aj to čo nie je vidieť
    • Len nechápem, že to na podpore TMS zatiaľ nikto neriešil. Teda hľadám ako besný na ich fóre aj v celom googli a ani stopa
    • takáto vážna vec nemohla snáď zostať bez povšimnutia???
    • No a za posledné sa mi zdá, že na takýto ošemetný oriešok je moja angličtina slabá. Teda na diskusiu. Nemám problém diskutovať okolo TMS Flexcel, to frčí a som spokojný (Adrian Gallero je veľmi ústretový). Na to stačí zdravý rozum. Ale na všelijaké Messages a "Blickages":), nemám dostatočné klasické vzdelanie ani v slovenčine..
    • Ešte ma napadla zúfalosť - že TMS má vlastné Forms. Preto som to vyskúšal aj na ich TAdvToolBarForm. Či to nemajú nejak optimalizované. Ale výsledok rovnaký. No teda nemajú..
    Čo sa tohoto problému týka, otázky rieši Bruno Fierens. A s tým to vyzerá na pohľad ťažšie.
    Pre súčasný stav sa zdá, že mi to ako tak funguje. Po vyššie uvedených úpravách..

    OK. Možno to raz skúsim aj s tou podporou. Teraz ale horúco riešim to, na čo stačí sedliacky rozum a aj to nestíham. Len som to chcel zabaliť do pekného obalu, nech si zvýrazním aktuálnu pokročilú verziu snaženia..

    [/list]
    « Poslední změna: 03-07-2019, 00:28:53 od miroB »

    Offline pf1957

    • Padawan
    • ******
    • Příspěvků: 2593
    • Karma: 133
      • Verze Delphi: D2007, XE3, DX10
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #6 kdy: 03-07-2019, 00:38:41 »
    Ako sa to vlastne rieši?
    Kdysi v drevnich dobach jsem to resil tak, ze jsem zavolal nejakou interni funkci VCL, ktera souvisela s D&D -> misto okna se vykreslil jen ramecek a posouvalo/hybalo se s nim. Ale HOSIP, musel bych to hledat.

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #7 kdy: 03-07-2019, 09:12:38 »

    Citace
    OK. Možno to raz skúsim aj s tou podporou.
    V takom prípade prosím o preklad nasledujúceho textu. Google translator by to mohol dobabrať. Prekladateľ to môže upraviť a doplniť podľa vlastnej ľubovôle. Ak by som nezvládal komunikáciu, tak viem, že mi tu pomôžete. Ďakujem.
    ...
    Používam TAdvOfficePager. Sú tam dva podstatné a neakceptovateľné nedostatky.

    1) Pri zmene veľkosti formulára je veľká odozva. Kurzor myši je už na okraji obrazovky a formulár stále nezareaguje
    2) Obsah TAdvOfficePager neskutočne preblikáva. Viď napríklad TAdvGroupBox
    S týmito nedostatkami bojuje niekoľko užívateľov. Pretože používate vlastné vykresľovanie, tak všetky naše snahy končia neúspechom.
    Prosíme Vás o zjednanie nápravy
    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.

    Offline František

    • Guru
    • *****
    • Příspěvků: 510
    • Karma: 6
      • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #8 kdy: 03-07-2019, 09:15:15 »
    Kdysi v drevnich dobach jsem to resil tak, ze jsem zavolal nejakou interni funkci VCL, ktera souvisela s D&D -> misto okna se vykreslil jen ramecek a posouvalo/hybalo se s nim. Ale HOSIP, musel bych to hledat.
    toto bola fičúrka nastavenia windows, tam by som hladal

    nieco taketo https://social.msdn.microsoft.com/forums/windows/en-US/82688e76-a513-49d4-b8f1-b62ecae56a0b/winforms-how-can-i-show-only-the-borders-when-resizing-the-form-using

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #9 kdy: 03-07-2019, 09:17:11 »
    Ak sa to týka aj iných komponentov, tak ich tam treba citovať.
    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #10 kdy: 03-07-2019, 09:18:27 »
    Ako sa to vlastne rieši?
    Kdysi v drevnich dobach jsem to resil tak, ze jsem zavolal nejakou interni funkci VCL, ktera souvisela s D&D -> misto okna se vykreslil jen ramecek a posouvalo/hybalo se s nim. Ale HOSIP, musel bych to hledat.
    V dnešnej dobe by nás s tým asi hnali. Vtedy to bola nutnosť kvôli slabému výkonu PC.
    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.

    Offline miroB

    • Guru
    • *****
    • Příspěvků: 519
    • Karma: 17
      • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #11 kdy: 03-07-2019, 15:36:38 »
    ..V takom prípade prosím o preklad nasledujúceho textu..
    Stano, ak si myslel mňa, tak mojou učebnicou angličtiny boli len knihy k Delphi.
    V živote som anglicky nepovedal ani jednu vetu. Hovorenú angličtinu tak tak rozoznám od vlámštiny :)
    Aby to nebolo hlúpe, tak rozumiem francúzsky a nemecky. Dokonca aj hovorím.
    Počítače neexistovali pokiaľ som bol dostatočne mladý. VŠ elektro mi naši zatrhli.
    Von sa nesmelo, tak načo? Vtedy sme nemohli tušiť, že príde celkom iný svet.
    Moje deti na Slovensko občas zájdu pozrieť. Vnuci budú síce slovenčine rozumieť. Ale použijú ju asi len u nás doma. Je to nejak naruby teraz.

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #12 kdy: 03-07-2019, 16:14:11 »
    Nemal som na mysli nikoho konkrétneho. Doteraz (2 x) sa vždy našiel nejaký dobrodinec. Verím, že aj teraz.
    Požiadavku som dal preto, lebo prvý vstup musí byť perfektný. Potom to už, aj pomocou google, ide :D
    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #13 kdy: 04-07-2019, 08:21:49 »
    Keď som všetkým komponentom nastavil DoubleBuffered na True, tak mi nič nebliká :)
    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.

    Offline Stanislav Hruška

    • Padawan
    • ******
    • Příspěvků: 4426
    • Karma: 39
      • Verze Delphi: XE7 professional
    Re:Zmena veľkosti formulára - veľké oneskorenie
    « Odpověď #14 kdy: 04-07-2019, 09:58:57 »

    Také polovičné zlepšenie. Okraj okna sa nemôže ťahať príliš rýchlo. Žiaľ, veľkosť okna sa mení skokovite. Čas odozvy sa skrátil asi na polovicu. Možno to niekoho inšpiruje na lepšie riešenie.
    Kód: Delphi [Vybrat]
    1. procedure TfrmFormMain.WMEnterSizeMove(var MsgSizeMove: TWMMove);
    2. var
    3.   I: Integer;
    4. begin
    5.   for I := 0 to offpgrPobes.AdvPageCount -1 do
    6.   begin
    7.     if (I <> offpgrPobes.ActivePageIndex) then
    8.     begin
    9.       SetAlign(offpgrPobes.AdvPages[I], True);
    10.       offpgrPobes.AdvPages[I].Visible := False;
    11.     end;
    12.   end;
    13. end;
    14. procedure TfrmFormMain.WMExitSizeMove(var MsgSizeMove: TWMMove);
    15. var
    16.   I: Integer;
    17. begin
    18.   for I := 0 to offpgrPobes.AdvPageCount -1 do
    19.   begin
    20.     if (I <> offpgrPobes.ActivePageIndex) then
    21.     begin
    22.       SetAlign(offpgrPobes.AdvPages[I], False);
    23.       offpgrPobes.AdvPages[I].Visible := True;
    24.     end;
    25.   end;
    26. end;
    27. procedure TfrmFormMain.SetAlign(const ACont: TControl; ADisableAlign: Boolean);
    28. var
    29.   I: Integer;
    30.   WinControl: TWinControl;
    31. begin
    32.   if (ACont = nil) then
    33.     Exit;
    34.  
    35.  
    36.   if ACont is TWinControl then
    37.   begin
    38.     WinControl := TWinControl(ACont);
    39.  
    40.  
    41.     if ADisableAlign then
    42.       WinControl.DisableAlign
    43.     else
    44.       WinControl.EnableAlign;
    45.  
    46.  
    47.     for I := 0 to WinControl.ControlCount -1 do
    48.       SetAlign(WinControl.Controls[I], ADisableAlign);
    49.   end;
    50. end;

    Delphi XE7, FireBird
    Expert na kladenie nejasne formulovaných otázok.