Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prüfen ob Scrollbar aktiviert (https://www.delphipraxis.net/161367-pruefen-ob-scrollbar-aktiviert.html)

EWeiss 30. Jun 2011 10:34


Prüfen ob Scrollbar aktiviert
 
Wie kann ich beim Memo gegenprüfen ob eine Scrollbar aktiviert wurde?
Grundsätzlich verfügt ein memo ja über beide Scrollbars Horiz/Vert

Ich prüfe nun mit meinem Code ob diese zur verfügung stehen.
Das problem ist nur Sie werden auch erkannt wenn sie nicht unter Eigenschaften aktiviert wurden (Sichtbar sind).

Wie kann ich also gegenprüfen ob sie aktiviert wurden unabhängig vom Eigenschaftsdialog.

Zur besseren Verständigung hier noch was Code!

Delphi-Quellcode:
function THookedScrollbar.StoreVertical(WinHandle: HWND): Boolean;
var
  State: Boolean;

begin

  Result := False;

  VScrInfo.cbSize := SizeOf(VScrInfo);
  VScrInfo.fMask := SIF_ALL;

  // ScrollBar vorhanden?
  State := GetScrollInfo(WinHandle, Windows.SB_VERT, VScrInfo);
 
  // keine ScrollBar vorhanden
  if not State then
    exit;

  // Lese aktuelle Bar Parameter
  VScrBar.cbSize := Sizeof(VScrBar);
  GetScrollBarInfo(WinHandle, integer(OBJID_VSCROLL), VScrBar);

  // kopiere den aktuellen Rect zur späteren bearbeitung
  CopyRect(VertRect, VScrBar.rcScrollBar);
  Result := True;
end;

State liefert immer True zurück egal ob unter Eigenschaften die Bars eingeschaltet wurden oder nicht!

gruss

Thom 30. Jun 2011 11:54

AW: Prüfen ob Scrollbar aktiviert
 
GetScrollInfo:
Zitat:

Return Value
Type: BOOL
If the function retrieved any values, the return value is nonzero.
Dadurch erhälst Du immer True, sobald eine Scrollbar zum Fenster gehört - unabhängig davon, ob sie eingeblendet ist oder nicht.

Das Problem hatte ich vor x Jahren auch einmal. Ich habe aber keine Möglichkeit im Win-API gefunden, die es ermöglicht, eindeutige festzustellen, ob eine integrierte Scrollbar sichtbar ist oder nicht.
Ich hatte mir dann damit beholfen, Client- und Fenstergröße miteinander zu vergleichen. Ist also zum Beispiel die Clientbreite gleich der Fensterbreite minus Scrollbarbreite (evtl. noch den Rahmen berücksichtigen), ist die vertikale Leiste eingeblendet. Diese Lösung ist zwar nicht schön - funktioniert aber in den meisten Fällen.

EWeiss 30. Jun 2011 12:12

AW: Prüfen ob Scrollbar aktiviert
 
Zitat:

Dadurch erhälst Du immer True, sobald eine Scrollbar zum Fenster gehört - unabhängig davon, ob sie eingeblendet ist oder nicht.
Das ist hart weil mir dann ein Teil im unteren bereich fehlt bzw. als Scrollbar gezeichnet wird obwohl nicht vorhanden.

Zitat:

Ich hatte mir dann damit beholfen, Client- und Fenstergröße miteinander zu vergleichen.
Wäre eine alternative.

Muss mir das mal näher anschauen.

PS:
Leider gibt es ja sowas nicht in Delphi ScrollBars eines Fensters den eigenen Bedürfnissen anzupassen ( Kostenlos ohne Komponente)
daher baue ich mir eine eigene LIB bzw.. Units die das ermöglichen sollen.

Danke!

gruss

Thom 30. Jun 2011 12:29

AW: Prüfen ob Scrollbar aktiviert
 
Zitat:

Zitat von EWeiss (Beitrag 1109190)
Leider gibt es ja sowas nicht in Delphi ScrollBars eines Fensters den eigenen Bedürfnissen anzupassen ( Kostenlos ohne Komponente)
daher baue ich mir eine eigene LIB bzw.. Units die das ermöglichen sollen.

Ja, das ist leider wahr (zumindest kenne ich keine derartige Lösung)... Da wünsche ich Dir viel Erfolg!

Viele Grüße

alfold 30. Jun 2011 12:31

AW: Prüfen ob Scrollbar aktiviert
 
Da ich ja immer noch daran arbeite:wink: kleiner Tip
Wenn hsi.nMax oder vsi.nMax<=0, wird die jeweilige Scrollbar nicht angeszeigt!
Automatisch passt sich, in diesem Beispiel Dein Grid in der Grösse an und die zu zeichnnde Fläsche wird um die jweilige Scroolbar grösser
Zitat:

Das ist hart weil mir dann ein Teil im unteren bereich fehlt bzw. als Scrollbar gezeichnet wird obwohl nicht vorhanden
stimmt also so nicht:wink:
GRuss alfold

EWeiss 30. Jun 2011 12:56

AW: Prüfen ob Scrollbar aktiviert
 
Zitat:

Zitat von alfold (Beitrag 1109203)
Da ich ja immer noch daran arbeite:wink: kleiner Tip
Wenn hsi.nMax oder vsi.nMax<=0, wird die jeweilige Scrollbar nicht angeszeigt!
Automatisch passt sich, in diesem Beispiel Dein Grid in der Grösse an und die zu zeichnnde Fläsche wird um die jweilige Scroolbar grösser
Zitat:

Das ist hart weil mir dann ein Teil im unteren bereich fehlt bzw. als Scrollbar gezeichnet wird obwohl nicht vorhanden
stimmt also so nicht:wink:
GRuss alfold

Ahhh das muss ich mal testen..
In wie weit das jetzt mit einem Memo funktioniert muss ich wiederum erst testen.

Jo ich mach das auch für meine SK_AERO LIB denke das ist einfacher zu händeln als
wenn ich zwei ScrollBars einzeln anfertigen (Programmieren muss).

gruss

EWeiss 30. Jun 2011 12:57

AW: Prüfen ob Scrollbar aktiviert
 
Zitat:

Zitat von Thom (Beitrag 1109201)
Zitat:

Zitat von EWeiss (Beitrag 1109190)
Leider gibt es ja sowas nicht in Delphi ScrollBars eines Fensters den eigenen Bedürfnissen anzupassen ( Kostenlos ohne Komponente)
daher baue ich mir eine eigene LIB bzw.. Units die das ermöglichen sollen.

Ja, das ist leider wahr (zumindest kenne ich keine derartige Lösung)... Da wünsche ich Dir viel Erfolg!

Viele Grüße

Funktioniert ja soweit schon abgesehen vom zeichnen der Bitmaps ;)
Schau mal unter meinen Projekten.

gruss

alfold 30. Jun 2011 13:07

AW: Prüfen ob Scrollbar aktiviert
 
Allerdings, ist ganz wichtig!!!! Vermische nicht Daten mit Graphic:evil:
OT// muss Dein Miditracker, was die GraphicRoutinen betreffen neu machen, leider wenig Zeit//OT

Gruss alfold

EWeiss 30. Jun 2011 13:14

AW: Prüfen ob Scrollbar aktiviert
 
Zitat:

Zitat von alfold (Beitrag 1109224)
Allerdings, ist ganz wichtig!!!! Vermische nicht Daten mit Graphic:evil:
OT// muss Dein Miditracker, was die GraphicRoutinen betreffen neu machen, leider wenig Zeit//OT

Gruss alfold

Hää ?
Keine Ahnung was du meinst.
Bei mir funktioniert das alles :)

PS:
Im Memo kann man die Scrollbar nicht auf Max = 0 stellen.
Die scheint virtuell erstellt zu werden.

gruss

alfold 30. Jun 2011 14:00

AW: Prüfen ob Scrollbar aktiviert
 
Ich weiss ja nicht was Du da machst aber in Deinem Grid funct es
Delphi-Quellcode:
        hsi.cbSize := Sizeof(SCROLLINFO);
        hsi.nMin  := XSizeMid;
        hsi.nMax  := (rc.Right) - (XSize - XSizeMid); //<--ist hier der wert <= 0 wird keine Scrollbar angezeigt
        hsi.nPos  := StartX + XSizeMid;
        hsi.fMask := SIF_POS or SIF_RANGE;
        SetScrollInfo(FHGrid, SB_HORZ, hsi, True);
Bei einem VCL Memo gibt es ja noch (ssHorizontal, ssVertical, ssNone, ssBoth)
Wenn ssHorizontal nicht aktiv ist passt sich xsize vom Memo auch an.

Wie Du das bei Dir umgesetzt hast :gruebel: weiss ich ja nicht.
EDIT:
wenn also hsi.nMax = 0 dann darf ssHorizontal nicht aktiv sein!

Gruss alfold


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz