AGB  ·  Datenschutz  ·  Impressum  







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

Hint überschreiben

Ein Thema von Rainer Wolff · begonnen am 3. Aug 2010 · letzter Beitrag vom 4. Aug 2010
Antwort Antwort
blackfin
(Gast)

n/a Beiträge
 
#1

AW: Hint überschreiben

  Alt 3. Aug 2010, 14:00
Jup, sieht ganz so aus
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#2

AW: Hint überschreiben

  Alt 3. Aug 2010, 14:12
Beim MouseEnter Alten Hint merken, ergänzen
Beim MouseLeave Alten Hint zurückschreiben
Oder, wenn du z.B. beim überfahren der Items einer Listbox die Caption des Items als Hint haben möchtest :
Delphi-Quellcode:
procedure TForm1.ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item : integer;
  HS : string;
  LB : TListBox;
begin
  LB := Sender as TListbox;
  item := LB.itemAtpos(Point(x, y), true);
  if item >= 0 then
  begin
    HS := LB.Items.Strings[Item];
    if HS <> LB.Hint then
    begin
      LB.Hint := HS;
      Application.ActivateHint(Point(x, y));
    end;
  end;
end;
Lässt sich sicherlich auch auf andere Controls ausweiten ohne eine neue Klasse abzuleiten
Glückauf

Geändert von guinnes ( 3. Aug 2010 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Hint überschreiben

  Alt 3. Aug 2010, 18:12
Beim MouseEnter Alten Hint merken, ergänzen
Beim MouseLeave Alten Hint zurückschreiben
Das wars nun gar nicht, was ich wollte.
Inzwischen hab ich meinen Code in den Komponenten noch etwas hin und her geschoben und mache es so: Alle Komponenten, für die ich das ganze brauche (Abgeleitet von Shape, Label, Bitmap, Edit...) haben sowieso ein gemeinsames Interface.

Ich verwende ein TApplicationEvents-Objekt und in OnShowHint:
Delphi-Quellcode:
procedure TMainWindow.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  if Supports(HintInfo.HintControl, IMyInterface) then
  begin
    HintStr:=Hintstr+' '+(HintInfo.HintControl as IMyInterface).myZusatzHint;
  end;
end;
Aber ich wollte das ganze halt am liebsten in die Komponenten rein schieben, damit ich nicht in jedem Projekt im Hauptformular an den zitierten Code denken muss.
Da vermute ich jetzt einfach, dass es mit dem Hint überschreiben nicht geht, wenn nicht noch jemand eine geniale Idee hat.

Gruß Rainer

Geändert von mkinzler ( 3. Aug 2010 um 19:20 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: Hint überschreiben

  Alt 3. Aug 2010, 18:25
Wieso muß man eigentlich einen eigenen Hint-Property erstellen?

Die VCL kennt nur "ihr" Property und nutzt auch dieses für die Anzeige.
Was sie nicht kennt, das kann die VCL nicht nutzen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#5

AW: Hint überschreiben

  Alt 3. Aug 2010, 18:59
Wieso muß man eigentlich einen eigenen Hint-Property erstellen?

Die VCL kennt nur "ihr" Property und nutzt auch dieses für die Anzeige.
Was sie nicht kennt, das kann die VCL nicht nutzen.
Genau deswegen funktiionieren die ganzen Ansätze mit dem Überschreiben des Properties ja nicht. Man hätte nur dann Erfolg, wenn es virtuelle Getter und Setter gäbe, aber die gibt es nun mal nicht...
Uwe Raabe
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Hint überschreiben

  Alt 3. Aug 2010, 19:11
Wieso muß man eigentlich einen eigenen Hint-Property erstellen?
Zum Hintergrund des ganzen: Die Komponenten benutze ich zur Visualisierung von Maschinensteuerungen. Also z. B. Endschalter oder Positionsanzeige. Die Komponenten haben eine Bedeutung, die im Hint auch angezeigt wird, also z. B. Türe offen/geschlossen, oder aktuelle Antriebsposition.
Ausserdem haben die Komponenten noch Eigenschaften, die sie mit der Steuerung verknüpfen, welches Eingangsbit, oder Merkerbit z.b. mit der Komponente angesprochen wird.
Diese Info möchte ich zusätzlich zur eigentlichen Komponentenbedeutung im Hint anzeigen, also z. B. "Kontrollschalter Türe (Eingang 8.0)", aber nicht grundsätzlich, sondern wählbar.

Gruß Rainer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: Hint überschreiben

  Alt 3. Aug 2010, 20:37
Entweder du mußt ständig/regelmäßig alle Hint-Texte anpassen, also vorsorglich bevor sie angezeigt werden könnten, oder ...


entweder man definiert einen Marker, welcher dann ersetzt wird:
Delphi-Quellcode:
Label1.Hint := ':MyHint:'; // natürlich im OI deklariert
Label1.ShowHint := True;

procedure TForm5.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := ShowHint;
end;

procedure TForm5.ShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: Controls.THintInfo);
begin
  if HintStr = ':MyHint:then
    HintStr := 'die aktuelle Zeit ist ' + TimeToStr(Now);
  if HintStr = ':MyOtherHint:then
    HintStr := 'das aktuelle Datum ist ' + DateToStr(Now);
end;
das geht auch mit Teilen
Delphi-Quellcode:
Label1.Hint := 'die aktuelle Zeit ist :MyHint:';
Label1.ShowHint := True;

procedure TForm5.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := ShowHint;
end;

procedure TForm5.ShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: Controls.THintInfo);
begin
  HintStr := StringReplace(HintStr, ':MyHint:', TimeToStr(Now), []);
  HintStr := StringReplace(HintStr, ':MyOtherHint:', DateToStr(Now), []);
end;
man kann aber auch über's Control gehn:
Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := ShowHint;
end;

procedure TForm5.ShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: Controls.THintInfo);
begin
  if HintInfo.HintControl = Label1 then
    HintStr := 'die aktuelle Zeit ist ' + TimeToStr(Now);
end;
ShowHint wird immer aufgerufen, kurz bevor irgendein Hint angezeigt wird.


Aber schöner wäre es natürlich, wenn in jeder Komponente auch ein OnHint existieren würde, damit man vor Ort reagieren und sich dort entsprechende Eventhandler schreiben könnte.

Gut, man könnte auch ein anderes Event mißbrauchen, welches man sonst nirgends in der Anwendung verwendet hat.
> OnEndDock bietet sich oftmals an
Delphi-Quellcode:
Label1.ShowHint := True;
Label1.OnEndDock := Label1EndDock;

procedure TForm5.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := ShowHint;
end;

procedure TForm5.ShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: Controls.THintInfo);
begin
  if Assigned(TForm(HintInfo.HintControl).OnEndDock) then
  begin
    TForm(HintInfo.HintControl).OnEndDock(HintInfo.HintControl, nil, 0, 0);
    HintStr := TForm(HintInfo.HintControl).Hint;
  end; // TForm wurde nur verwendet, da .Hint und
end; // .OnEndDock in TControl als protected deklariert sind

procedure TForm5.Label1EndDock(Sender, Target: TObject; X, Y: Integer);
begin
  TLabel(Sender).Hint := 'die aktuelle Zeit ist ' + TimeToStr(Now);
  // oder Label1.Hint := 'die aktuelle Zeit ist ' + TimeToStr(Now);
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Aug 2010 um 20:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#8

AW: Hint überschreiben

  Alt 3. Aug 2010, 22:41
Zum Hintergrund des ganzen: Die Komponenten benutze ich zur Visualisierung von Maschinensteuerungen. Also z. B. Endschalter oder Positionsanzeige. Die Komponenten haben eine Bedeutung, die im Hint auch angezeigt wird, also z. B. Türe offen/geschlossen, oder aktuelle Antriebsposition.
Ausserdem haben die Komponenten noch Eigenschaften, die sie mit der Steuerung verknüpfen, welches Eingangsbit, oder Merkerbit z.b. mit der Komponente angesprochen wird.
Diese Info möchte ich zusätzlich zur eigentlichen Komponentenbedeutung im Hint anzeigen, also z. B. "Kontrollschalter Türe (Eingang 8.0)", aber nicht grundsätzlich, sondern wählbar.
Wie wäre es, wenn du in einem OpUpdate-Event einer Action, im Application.OnIdle oder in einem Timer.OnTrigger die Hints alle zentral anpasst. Dann hast du wenigstens alles an einer Stelle. Macht natürlich nur Sinn, wenn sich der Hint-Inhalt hireichend oft ändert.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#9

AW: Hint überschreiben

  Alt 4. Aug 2010, 07:37
Klar könnte man im Prinzip alle Hints sofort anpassen, wo sich der Status ändert.
Also entweder bekommt man die Änderung mit und ändert da auch den Hint
oder man pollt eben über 'nen Timer o.Ä. und fragt ständig alle Status (mit langem U oder halt Statusse ) abund setzt die Hints neu.

Auch wenn die meisten der jedesmal gesetzten Hints wohl niemals angezeigt wird. (also könnte man das Ganze uch wieder als Pollen bezeichnen, was aus irgendwelchen unerfindlichen Gründen einige/viele nicht mögen )

Oder man reagiert eben auf das Anzeigen eines Hints, fragt kurz den aktuellen Status ab und setzt nur diesen einen Hint.
Ein Therapeut entspricht 1024 Gigapeut.
  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 08:34 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