Einzelnen Beitrag anzeigen

fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#1

Memo verhindert scrollen wenn auf VerticalScrollbox

  Alt 9. Okt 2024, 17:34
Hi,

mal ganz off Topic und wegen Frust
Programmiert eigentlich irgendjemand eine ernstzunehmende Anwendung für den mobile Bereich mit Delphi? Ich bezweifle das mittlerweile bei den ganzen Basics die nicht funktionieren so langsam.

Also nun zum Thema
Wenn man ein Memo Feld auf eine VerticalScrollbox platziert und noch andere Elemente auf der Vertical Scrollbox hat, die Scrollbox also in der Theorie gescrollt werden können soll, dann verliert die Scrollbox diese Fähigkeit wenn ein MemoFeld auf ihr liegt und man versucht über das Memofeld zu scrollen.
Das memoFeld frist also das Scroll Event von der Scrollbox.
Mir ist schon klar, dass es wahrscheinlich damit zusammen hängt, dass das Memo selbst auch scrollbar ist, wenn es mehr text hat als es anzeigen kann, aber ich habe keinen direkten Weg gefunden wie ich das irgendwie einfach steuern könnte.
Wisst ihr weiter?

Ich bin aktuell folgende Lösung am Testen, aber nicht wirklich zufrieden, weil meine Form "Zuckt", funktionieren tut es aber zumindest schon mal.

Delphi-Quellcode:
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  FPrevMousePosY := Y;
  FPrevMousePosX := X;
end;

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
var
  lMemo: TCustomMemo;
  lRect: TRectangle;
  procedure ScrollVerticalby(_y: Single);
  begin
    lmemo.OnMouseMove := nil;
    VertScrollBox1.ScrollBy(0,_y);
    lmemo.OnMouseMove := Memo1MouseMove;
  end;

begin
  lMemo := Sender as TCustomMemo;
  lRect := lMemo.Parent as TRectangle;

  if not Assigned(lMemo.VScrollBar) then
    ScrollVerticalby( Y - FPrevMousePosY)
  else if not lMemo.VScrollBar.Visible then
  begin
    ScrollVerticalby( Y - FPrevMousePosY);
  end
  else if (lMemo.VScrollBar.Value = lMemo.VScrollBar.Max) or (lMemo.VScrollBar.Value = lMemo.VScrollBar.Min) then
    ScrollVerticalby( Y - FPrevMousePosY);
  FPrevMousePosY := Y;
  FPrevMousePosX := X;
end;

procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  FPrevMousePosY := 0;
  FPrevMousePosX := 0;
end;
  Mit Zitat antworten Zitat