🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
9 messages
9 total messages Started by kameleonsql Fri, 05 Oct 2018 13:42
Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346769
Author: kameleonsql
Date: Fri, 05 Oct 2018 13:42
112 lines
4808 bytes
Witam,
Skończyłem właśnie migrować te parę milionów linii kodu z Delphi 2010 do 
10.2. Generalnie przez tydzień to się dało zrobić, (trochę komponentów innych firm, swoich i niespodzianek typu GotoBookmark(TArray<Byte>(pointer(DBGridView.SelectedRows.Items[i]) i zabawy z Unitami, ale kod jest już przeniesiony i działa).
Być może jestem już zmęczony, ale pozostała jeszcze jedna zagwozdka (pamiętam ten problem chyba w D7 był, ale w D2010 to działało dobrze). Potrzebuje zdarzenie OnMouseDown i detekcję prawego klawisza myszy w DBGrid, działa tylko jeśli mysz zostanie użyta na obszarze DBGrid bez rekordów. Ktoś to już przerabiał ?

Pozdrawiam
---
Roman

Ps.
Znalazłem coś takiego (wykopalisko z 2002), ale chyba nie muszę ruszać źródeł w 10.2 ?

procedure TCustomDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
var
  Cell: TGridCoord;
  OldCol,OldRow: Integer;
  MasterCol: TColumn;
begin
  if not AcquireFocus then Exit;
  if (ssDouble in Shift) and (Button = mbLeft) then
  begin
    DblClick;
    Exit;
  end;

  if Sizing(X, Y) then
  begin
    FDatalink.UpdateData;
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;

  Cell := MouseCoord(X, Y);
  if (Cell.X < 0) and (Cell.Y < 0) then
  begin
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;

  if (DragKind = dkDock) and (Cell.X < FIndicatorOffset) and
    (Cell.Y < FTitleOffset) and (not (csDesigning in ComponentState)) then
  begin
    BeginDrag(false);
    Exit;
  end;

  if PtInExpandButton(X,Y, MasterCol) then
  begin
    MasterCol.Expanded := not MasterCol.Expanded;
    ReleaseCapture;
    UpdateDesigner;
    Exit;
  end;

  if ((csDesigning in ComponentState) or (dgColumnResize in Options)) and
    (Cell.Y < FTitleOffset) then
  begin
    FDataLink.UpdateData;
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;

  if FDatalink.Active then
    with Cell do
    begin
      BeginUpdate;   { eliminates highlight flicker when selection moves }
      try
        FDatalink.UpdateData; // validate before moving
        HideEditor;
        OldCol := Col;
        OldRow := Row;
        if (Y >= FTitleOffset) and (Y - Row <> 0) then
          FDatalink.MoveBy(Y - Row);
        if X >= FIndicatorOffset then
          MoveCol(X, 0);
        if (Button = mbLeft) and (dgMultiSelect in Options) and
FDatalink.Active then
          with FBookmarks do
          begin
            FSelecting := False;
            if ssCtrl in Shift then
              CurrentRowSelected := not CurrentRowSelected
            else
            begin
              Clear;
              CurrentRowSelected := True;
            end;
          end;

    if (Button = mbLeft) and
      (((X = OldCol) and (Y = OldRow)) or (dgAlwaysShowEditor in Options))
then
        begin               // Added by K.S.
          ShowEditor; { put grid in edit mode }
          if CanEditShow then Exit;   // The condition added now by K.S.
        end                  // Added by K.S.
        else
          InvalidateEditor; { draw editor, if needed }
      finally
        EndUpdate;
      end;
    end;
  if Assigned(OnMouseDown) then               // Added by K.S.
    OnMouseDown(Self, Button, Shift, X, Y); // Added by K.S.
end;

Compile this unit and place the newly created DBGrids.dcu(which should be
again in the Source\Vcl directory) in the Delphi 6\Lib directory. Now open
your project and rebuild it and it should work if you have done all that
right.
The original code is by Krzysztof Szyszka. 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346770
Author: Krzysztof Szyszka
Date: Fri, 05 Oct 2018 17:31
31 lines
2705 bytes
> Skończyłem właśnie migrować te parę milionów linii kodu z Delphi 2010 do
> 10.2. Generalnie przez tydzień to się dało zrobić, (trochę komponentów innych firm, swoich i
> niespodzianek typu GotoBookmark(TArray<Byte>(pointer(DBGridView.SelectedRows.Items[i])
> i zabawy z Unitami, ale kod jest już przeniesiony i działa).

Z tym GotoBookmark to pojechałeś na maksa :-)
Wystarczy proste: DataSet.GotoBookmark(DBGridView.SelectedRows[i])
albo nawet DataSet.Bookmark := DBGridView.SelectedRows[i])

> Być może jestem już zmęczony, ale pozostała jeszcze jedna zagwozdka (pamiętam ten problem chyba w
> D7 był, ale w D2010 to działało dobrze). Potrzebuje zdarzenie OnMouseDown i detekcję prawego
> klawisza myszy w DBGrid, działa tylko jeśli mysz zostanie użyta na obszarze DBGrid bez rekordów.
> Ktoś to już przerabiał ?

Z tego, co widzę w kodzie DBGrida dla Delphi 10.2 Tokyo, to nic się nie zmieniło od czasów Delphi 6
w kwestii detekcji prawego klawisza myszy w zdarzeniu OnMouseDown. Nadal nie jest wywoływane.

> Znalazłem coś takiego (wykopalisko z 2002), ale chyba nie muszę ruszać źródeł w 10.2 ?

Z tego, co widzę w kodzie, to nadal musisz, ale nie na zasadzie kopiuj i wklej, tylko przez
wprowadzenie identycznej poprawki do metody TCustomDBGrid.MouseDown dla Delphi 10.2,
która nieco się zmieniła, ale jej końcowy fragment jest identyczny z tym dla Delphi 6.

Z ciekawości napisz mi, gdzie to wygrzebałeś :-)

-- 
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/ 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346771
Author: kameleonsql
Date: Fri, 05 Oct 2018 18:44
38 lines
3787 bytes
W dniu piątek, 5 października 2018 19:32:11 UTC+2 użytkownik Krzysztof Szyszka napisał:
> > Skończyłem właśnie migrować te parę milionów linii kodu z Delphi 2010 do
> > 10.2. Generalnie przez tydzień to się dało zrobić, (trochę komponentów innych firm, swoich i
> > niespodzianek typu GotoBookmark(TArray<Byte>(pointer(DBGridView.SelectedRows.Items[i])
> > i zabawy z Unitami, ale kod jest już przeniesiony i działa).
> 
> Z tym GotoBookmark to pojechałeś na maksa :-)
> Wystarczy proste: DataSet.GotoBookmark(DBGridView.SelectedRows[i])
> albo nawet DataSet.Bookmark := DBGridView.SelectedRows[i])
> 
> > Być może jestem już zmęczony, ale pozostała jeszcze jedna zagwozdka (pamiętam ten problem chyba w
> > D7 był, ale w D2010 to działało dobrze). Potrzebuje zdarzenie OnMouseDown i detekcję prawego
> > klawisza myszy w DBGrid, działa tylko jeśli mysz zostanie użyta na obszarze DBGrid bez rekordów.
> > Ktoś to już przerabiał ?
> 
> Z tego, co widzę w kodzie DBGrida dla Delphi 10.2 Tokyo, to nic się nie zmieniło od czasów Delphi 6
> w kwestii detekcji prawego klawisza myszy w zdarzeniu OnMouseDown. Nadal nie jest wywoływane.
> 
> > Znalazłem coś takiego (wykopalisko z 2002), ale chyba nie muszę ruszać źródeł w 10.2 ?
> 
> Z tego, co widzę w kodzie, to nadal musisz, ale nie na zasadzie kopiuj i wklej, tylko przez
> wprowadzenie identycznej poprawki do metody TCustomDBGrid.MouseDown dla Delphi 10.2,
> która nieco się zmieniła, ale jej końcowy fragment jest identyczny z tym dla Delphi 6.
> 
> Z ciekawości napisz mi, gdzie to wygrzebałeś :-)
> 
> -- 
> pozdrowienia
> Krzysztof Szyszka, X-Files Software
> Developer of X-DBGrid Component
> Embarcadero Technology Partner
> http://www.x-files.pl/

1. Wiesz jak to jest jak się kod przenosi, szukasz pierwszej pozycji w wynikach wyszukiwania spełniającej kryteria i masz https://www.board4all.biz/threads/delphi-10-2-tokyo-casting-to-tbookmark.659254/ 
2. Czyli jednak trzeba te źródła DBGrids.pas  modyfikować i mam rozumieć ponownie bpl'a skompilować (kto to mówił w https://groups.google.com/forum/#!topic/pl.comp.lang.delphi/RmOjnautaWQ że błędów nie znajduje :-), immo ?).
3. No masz np. tutaj  https://groups.google.com/forum/#!msg/borland.public.delphi.students/lfKaVKc194c/zlgXaNOJE3oJ 

Dzięki za odpowiedź :-)
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346772
Author: Krzysztof Szyszka
Date: Fri, 05 Oct 2018 19:25
30 lines
2483 bytes
> 1. Wiesz jak to jest jak się kod przenosi, szukasz pierwszej pozycji w wynikach wyszukiwania
> spełniającej kryteria i masz
> https://www.board4all.biz/threads/delphi-10-2-tokyo-casting-to-tbookmark.659254/

To ja chyba mało wiem jak to jest, bo jak się coś nie kompiluje w nowej wersji, to szukam,
co się zmieniło w źródłach, a nie na googlach, ale co kto lubi :-)

> 2. Czyli jednak trzeba te źródła DBGrids.pas  modyfikować i mam rozumieć ponownie bpl'a
> skompilować (kto to mówił w
> https://groups.google.com/forum/#!topic/pl.comp.lang.delphi/RmOjnautaWQ że błędów nie znajduje
> :-), immo ?).

Ale to nie jest żaden błąd. Nie było takiej funkcjonalności w Delphi 6 i nadal nie ma w Delphi 10.2 
Tokyo.
Ja kiedyś potrzebowałem, to sobie wprowadziłem, a że nie dało się bez ingerencji w źródła DBGrida,
to nadal musisz w nie ingerować, jeśli potrzebujesz tej funkcjonalności. Zawsze mogłeś użyć XDBGrida 
:-)

> 3. No masz np. tutaj
> https://groups.google.com/forum/#!msg/borland.public.delphi.students/lfKaVKc194c/zlgXaNOJE3oJ

No tak, forum dla studentów wiecznie żywe w wyszukiwarce. Dzięki za info.


-- 
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/ 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346773
Author: Roman Tyczka
Date: Sat, 06 Oct 2018 10:15
10 lines
1466 bytes
On Fri, 5 Oct 2018 11:44:45 -0700 (PDT), kameleonsql@gmail.com wrote:

> 2. Czyli jednak trzeba te źródła DBGrids.pas  modyfikować i mam rozumieć ponownie bpl'a skompilować (kto to mówił w https://groups.google.com/forum/#!topic/pl.comp.lang.delphi/RmOjnautaWQ że błędów nie znajduje :-), immo ?).

Możesz przecież wyprowadzić swoje TKameleonDBGrid i w nim to overridować.
Zmiana w całm projekcie DBGrida na KamelonDBGrida to już prosta zabawa.

-- 
pozdrawiam
Roman Tyczka
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346774
Author: kameleonsql
Date: Sat, 06 Oct 2018 10:49
23 lines
3268 bytes
W dniu sobota, 6 października 2018 12:15:22 UTC+2 użytkownik Roman Tyczka napisał:
> On Fri, 5 Oct 2018 11:44:45 -0700 (PDT), kameleonsql@gmail.com wrote:
> 
> > 2. Czyli jednak trzeba te źródła DBGrids.pas  modyfikować i mam rozumieć ponownie bpl'a skompilować (kto to mówił w https://groups.google.com/forum/#!topic/pl.comp.lang.delphi/RmOjnautaWQ że błędów nie znajduje :-), immo ?).
> 
> Możesz przecież wyprowadzić swoje TKameleonDBGrid i w nim to overridować.
> Zmiana w całm projekcie DBGrida na KamelonDBGrida to już prosta zabawa.
> 
> -- 
> pozdrawiam
> Roman Tyczka

Tak, to rozwiąże, override (bo modyfikowanie źródeł Delphi nie wchodzi w grę) ... 
Tylko dziwi mnie podejście np. Krzysztofa Szyszki, odnośnie "takiej funkcjonalności nie było ...". Jest zdarzenie OnMouseDown i nie działa deterministycznie (to jest błąd !!!), działa jak DBGrid nie ma zawartości, nie działa jak ma (poza tym w Delphi 2010 działa prawidłowo), jaka to dodatkowa funkcjonalność ???
Projekt ma już 20 lat, jest w Delphi od 1997 roku i jak wiadomo klient, przyzwyczajony do określonych rozwiązań nie jest szczęśliwy jeśli zmienia się filozofie przeglądarek. Do szukania, filtrowania, agregowania itd. itp, każdy browser ma dodatkową formę MDI z tymi właśnie funkcjonalnościami, a dostęp do tej formy jest właśnie pod prawym klawiszem na DBGrid (no i nie jest TPopupMenu). Dlatego browsery podstawowych danych dalej używają TDBGrid (to wyjaśnienie dla tych wszystkich, co zaraz napiszą użyj komponentu x, y, z).
 
No i na koniec, właśnie zapłaciłem za wsparcie do Delphi 10.2 i nie jestem przekonany, że to były dobrze wydane pieniądze :(

Pozdrawiam
---
Roman 

 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346777
Author: Krzysztof Szyszka
Date: Sun, 07 Oct 2018 07:57
11 lines
1542 bytes
> Możesz przecież wyprowadzić swoje TKameleonDBGrid i w nim to overridować.

Dobrze wiesz, że choć jest to najbardziej prawidłowe podejście, to niestety nie zawsze możliwe do
zastosowania i IMHO tak jest w tym przypadku.

-- 
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/ 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346775
Author: Krzysztof Szyszka
Date: Sun, 07 Oct 2018 08:13
25 lines
2634 bytes
> Tylko dziwi mnie podejście np. Krzysztofa Szyszki, odnośnie "takiej funkcjonalności nie było ...".
> Jest zdarzenie OnMouseDown i nie działa deterministycznie (to jest błąd !!!), działa jak DBGrid
> nie ma zawartości, nie działa jak ma (poza tym w Delphi 2010 działa prawidłowo), jaka to dodatkowa
> funkcjonalność ???

Skoro twierdzisz, że w twoim projekcie z Delphi 2010 to zdarzenie "działa prawidłowo", a w Delphi
10.2 nie, to lepiej użyj debuggera i sprawdź dlaczego jest jakaś różnica w działaniu, bo metoda
TCustomDBGrid.MouseDown, którą tu przytoczyłeś z wykopalisk niewiele się różni między Delphi 6,
2010 i 10.2 i w żadnej wersji Delphi na końcu tej metody nie jest wywoływane zdarzenie OnMouseDown.

> No i na koniec, właśnie zapłaciłem za wsparcie do Delphi 10.2 i nie jestem przekonany, że to były
> dobrze wydane pieniądze :(

Jeśli liczysz na to, że w ramach wsparcia do Delphi 10.2 Embarcadero wprowadzi do następnej wersji
taką poprawkę sprzed 20 lat wrzuconą do sieci przez jakiegoś programistę, to rzeczywiście wyrzuciłeś
te pieniądze w błoto :-)

-- 
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/
Join to "Delphi X-DBGrid Component Community"
https://plus.google.com/#communities/100842098152269100547 
Re: Delphi 10.2 - DBGrid brak reakcji na prawy klawisz myszy jeśli są rekordy
#346776
Author: kameleonsql
Date: Sun, 05 May 2019 17:30
18 lines
2372 bytes
Witam,
problem rozwiązałem ostatecznie dość prosto i to już jakiś czas temu, dziś zerknąłem na grupę i przypomniałem sobie o tym. Piszę, bo rozwiązanie jest banalne, a jak wiemy takie są najlepsze :-). Po prostu wykorzystałem zdarzenie z TPopupMenu (to jeszcze działa dobrze w Delphi, nie wiadomo jak długo :-)) OnPopup i do dynamicznego zamknięcia TPopupMenu (no nie działa np. CloseMenu w Delphi 10.2). Coś takiego ....

procedure TForm1.PopupTriggerPopup(Sender: TObject);
begin
  try
   // kod do wykonania 
  finally
    PostMessage(PopupTrigger.WindowHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
    PostMessage(PopupTrigger.WindowHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
  end;
end;

Może się komuś przyda ...
----
Pozdrawiam
Roman
 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads