Autor Téma: VirtualStringTree - radenie podľa dvoch stĺpcov Vyriešené  (Přečteno 4000 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Mám dva stĺpce. Bloky domu a k nim vchody. Potrebujem, aby sa mi pri zoradení podľa blokov zoradili aj vchody.

Bloky  | vchody
Blok 1 | A1
Blok 1 | A2
Blok 1 | B1
« Poslední změna: 23-04-2014, 12:22:42 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #1 kdy: 12-04-2014, 15:27:34 »
a co presne na tom nevis? :)

Kód: Delphi [Vybrat]
  1.       Result := CompareXXX(blok1, blok2);
  2.       if Result=0 then
  3.         Result := CompareXXX(vchod1, vchod2);

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #2 kdy: 12-04-2014, 15:27:39 »
Toto mi funguje
Kód: Delphi [Vybrat]
  1. procedure TfrmBlocks.vstMasterCompareNodes(...
  2.  
  3.   case Column of
  4.      0: Result := AnsiCompareText(Data1.SVB + Data1.Block, Data2.SVB + Data2.Block);
  5.  
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #3 kdy: 12-04-2014, 15:33:35 »
Tvoje tiež funguje. Je tu jeden rozdiel. Moje riešenie zoradí aj vchody podľa sdAscendingt či sdDescending. Tvoje zoradí vchody vždy vzostupne.

Hodia sa obe riešenia. Podľa nálady.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #4 kdy: 12-04-2014, 15:38:07 »
Toto mi funguje
Kód: Delphi [Vybrat]
  1. procedure TfrmBlocks.vstMasterCompareNodes(...
  2.  
  3.   case Column of
  4.      0: Result := AnsiCompareText(Data1.SVB + Data1.Block, Data2.SVB + Data2.Block);
  5.  

Bože, to je Standovina... Nebo Hruškovina... ? :)
Embarcadero Technology Partner

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #5 kdy: 12-04-2014, 15:46:11 »
oxo to vystihl :)

@Hruska:
samozrejme, asc/desc si hlidas pomoci
Result:=-Result ...
proste tam das zapor, pokud to chces opacne

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #6 kdy: 12-04-2014, 15:48:44 »
Oboje. Máš lepší nápad?

Mne pripadá trocha divné, že si zoradím strom podľa blokov a vchody budú rozhádzané. To sa užívateľovi bude hľadať veľmi dobre.

Ja si dosť potrpím na užívateľskom komforte. Snažím sa vcítiť do kože užívateľa.
Citace
proste tam das zapor, pokud to chces opacne
Ale pri mojom riešení sa nestarám ako sa radí prvý stĺpec. Ušetril som jeden if. Vlastne dva.
« Poslední změna: 12-04-2014, 15:51:33 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #7 kdy: 12-04-2014, 15:52:44 »
- ono neslo o to, ze bys to nemel radit, ale radit to efektivne
- v asm se nevyznam, ale secteni stringu bude asi narocnejsi jak jeden usetreny if :D

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #8 kdy: 12-04-2014, 16:07:51 »
Citace
v asm se nevyznam, ale secteni stringu bude asi narocnejsi jak jeden usetreny if
O tom neviem nič. Veď nám to snáď niekto upresní.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #9 kdy: 12-04-2014, 16:30:26 »
Neviem či ste to mysleli takto, ale nasledujúce nemá vplyv na výsledok. Mám na mysli to mínus.
Kód: Delphi [Vybrat]
  1.     0:
  2.     begin
  3.       Result := AnsiCompareText(Data1.SVB, Data2.SVB);
  4.  
  5.       if Result = 0 then
  6.       begin
  7.         Result := AnsiCompareText(Data1.Block, Data1.Block);
  8.  
  9.         if (TVirtualStringTree(Sender).Header.SortDirection = sdDescending) then
  10.           Result := -Result;
  11.       end;
  12.     end;
  13.  
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #10 kdy: 12-04-2014, 16:42:59 »
Neviem či ste to mysleli takto, ale nasledujúce nemá vplyv na výsledok. Mám na mysli to mínus.
Kód: Delphi [Vybrat]
  1. ...
  2. Result := AnsiCompareText(Data1.Block, Data1.Block);
  3. ...
  4.  

To bude tím, že porovnáváš Data1.Block s tím samým Data1.Block. Pak už je jedno jestli vrátíš 0 nebo -0 ;)
« Poslední změna: 12-04-2014, 16:48:44 od TLama »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #11 kdy: 12-04-2014, 16:46:32 »
Chyba to bola, ale výsledok sa nezmenil.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #12 kdy: 12-04-2014, 16:53:02 »
Chyba to bola, ale výsledok sa nezmenil.

Změnil by se, kdybys někdy splnil podmínku se SortDirection. Zkus si místo té podmínky na chvíli tu negaci hardcodovat.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #13 kdy: 12-04-2014, 16:59:17 »
@Hruska:
nevim, co vyrabis ... ani to "-" vlastne nepotrebujes, protoze VST to dela za tebe, staci neco takoveho

Kód: Delphi [Vybrat]
  1.   if Sender.SortColumn <> HitInfo.Column then
  2.     Sender.SortColumn := HitInfo.Column
  3.   else if Sender.SortDirection = sdAscending then
  4.     Sender.SortDirection := sdDescending
  5.   else
  6.     Sender.SortDirection := sdAscending;
  7.  
  8.   VST1.SortTree(HitInfo.Column, Sender.SortDirection);

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:VirtualStringTree - radenie podľa dvoch stĺpcov
« Odpověď #14 kdy: 12-04-2014, 17:04:23 »
Citace
Změnil by se, kdybys někdy splnil podmínku se SortDirection.
To bolo prvé čo som si overil krokovaním.
Citace
Zkus si místo té podmínky na chvíli tu negaci hardcodovat.
Skúsim, ale už/až doma. Na dnes sa lúčim.

To <z> ak tomu rozumiem, ta navrhované riešenie platí pre jeden stĺpec. Ale vyskúšam si to tiež
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.