AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Scrollbar aktiviert

Ein Thema von EWeiss · begonnen am 30. Jun 2011 · letzter Beitrag vom 30. Jun 2011
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 10:34
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

Geändert von EWeiss (30. Jun 2011 um 18:25 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 11:54
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.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 12:12
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

Geändert von EWeiss (30. Jun 2011 um 12:18 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 12:29
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
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (30. Jun 2011 um 12:34 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 12:57
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
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 13:07
Allerdings, ist ganz wichtig!!!! Vermische nicht Daten mit Graphic
OT// muss Dein Miditracker, was die GraphicRoutinen betreffen neu machen, leider wenig Zeit//OT

Gruss alfold
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 14:17
Schau mal unter meinen Projekten.
Werde ich machen!

Aber mir ist gerade etwas anderes aufgefallen:
In einem TMemo werden bei ScrollBars:=ssBoth immer beide Leisten angezeigt, auch wenn sie nicht notwendig sind (dann eben nur deaktiviert). TMemo kennt ja irgendwie kein automatisches Ein- und Ausblenden der Scrollbars.

Insofern ist mein Vorschlag, die Clientgröße des Fensters zu testen, völliger Unsinn, da die Leisten immer da sind...

Was ich aber jetzt gefunden habe:
SCROLLBARINFO
Aus dem Parameter rgstate lassen sich Rückschlüsse darauf ziehen, ob ein Element (oder die gesamte Scrollbar) zum Beispiel unsichtbar (STATE_SYSTEM_INVISIBLE) oder deaktiviert (STATE_SYSTEM_UNAVAILABLE) ist.

Ist wenig Text im Memo enthalten und die vertikale Scrollbar überflüssig, sieht der Status so aus:
Delphi-Quellcode:
ScrollBarInfo.rgstate[0]=STATE_SYSTEM_UNAVAILABLE; //gesamte Scrollbar deaktiviert
ScrollBarInfo.rgstate[1]=STATE_SYSTEM_UNAVAILABLE; //oberer Button deaktiviert
ScrollBarInfo.rgstate[2]=STATE_SYSTEM_UNAVAILABLE; //Page up-Bereich deaktiviert
ScrollBarInfo.rgstate[3]=STATE_SYSTEM_STATE_SYSTEM_INVISIBLE; //verschiebbarer Button unsichtbar
ScrollBarInfo.rgstate[4]=STATE_SYSTEM_UNAVAILABLE; //Page down-Bereich deaktiviert
ScrollBarInfo.rgstate[5]=STATE_SYSTEM_UNAVAILABLE; //unterer Button deaktiviert
Wird die vertikale Scrollbar benötigt, ändert sich das so:
Delphi-Quellcode:
ScrollBarInfo.rgstate[0]=0; //gesamte Scrollbar ist aktiviert
//...
Vielleicht hilft Dir das weiter...
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 12:31
Da ich ja immer noch daran arbeite 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
GRuss alfold

Geändert von alfold (30. Jun 2011 um 12:44 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Prüfen ob Scrollbar aktiviert

  Alt 30. Jun 2011, 12:56
Da ich ja immer noch daran arbeite 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
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz