Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108
Erhaltene Danke: 2



BeitragVerfasst: Mo 16.10.17 19:04 
Hallo,
Das MainMenu nutzt/kennt jeder Programmierer. Vergibt man für bestimmte Kommandos ein ShortCut (z.B. Strg+C), stehen die Informationen in 2 Spalten fein säuberlich ausgerichtet. Linksbündig der Text "Kopieren", rechtsbündig das ShortCut "Strg+C". Ich würde gerne dazwischen eine dritte rechtsbündig ausgerichtete Spalte einführen, für ergänzende Texte (5 Zeichen lang).

Geeignet könnte sein, wenn man im Feld Caption den Text ausrichten/formatieren könnte (mit der Tab-Taste funktioniert es nicht).
Hinweis: meine bisherige "Lösung", diesen 3.Bereich durch Einfügen von Blank zu realisieren und optisch bestmöglich auszurichten, liefert immer einen leichten Flattersatz, der je nach Pixelzahl des Bildschirmas kleiner/größer wird.
Gibt es hier eine einfache Lösung?
mfg hRb
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 24.10.17 17:55 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es hier eine einfache Lösung?

Verwende einen nicht proportionalen Zeichensatz. Wie das in etwa geht, steht hier: edn.embarcadero.com/article/27128
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108
Erhaltene Danke: 2



BeitragVerfasst: Di 24.10.17 22:25 
Guten Abend G. Kayser,
1. den Link edn.embarcadero.com/article/27128 gibt es noch. Dort steht jedoch:
Zitat:
First, take the opportunity to download the complete source for this project from CodeCentral.

und verweist auf "https://codecentral.borland.com/codecentral/ccweb.exe/download?id=15770". Dieser Link funktioniert jedoch nicht mehr.

2. Den Hinweis eine nicht-proportionale Schrift zu verwenden, macht mich ein wenig ratlos, denn es gibt im Menü-Objekt keinen Font-Parameter zum Einstellen der Schrift. Von daher komme ich mit den derzeitigen Hinweisen nicht weiter. Kannst Du noch etwas konkreter werden?
MfG hRb
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1695
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 25.10.17 07:39 
Richtig, es gibt keine Font-Eigenschaft, dennoch lässt sich über den Parameter ACanvas: TCanvas; die Schrift entsprechend einstellen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.CustomMenu1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  ACanvas.Font.Name := 'Schriftart'
end;

Ich meine, es ist unwesentlich, ob die Schrift nun proportional ist oder nicht. Hier wird die Textbreite (ACanvas.TextWidth()) entscheidend sein.
Grob umgesetzt, müsste man mit jeden neuen TMenuItem, sobald eine Catption gesetzt wurde, alle Captions durchgehen, die Textbreite ermitteln, einen kleinen Abstand dazu rechnen, daran den neuen Text (von bis zu 5 Zeichen) anhängen und die Breite des gesamten Menüs entsprechend anpassen, sofern dies nicht automatisch erfolgt. Die längste/höchste Textbreite eines TMenuItem ist dabei ausschlaggebend.
Liest sich alles sehr einfach, jedoch müsste ich mir das selber mal anschauen. :D

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108
Erhaltene Danke: 2



BeitragVerfasst: Mi 25.10.17 10:04 
Hallo Frühlingsrolle,
Nun, das mit der Schriftart ist m.E. nicht unwesentlich. Könnte man die ändern (z.B. in Courier New), dann würde ja der unschöne Flattersatz automatisch verschwinden.
Tatsächlich sehe auch ich einen großen Aufwand, weil ich die Funktionen ja für alle Pulldown-Felder des MainMenu benötige. Und da gibt es in der Breite große Unterschiede, genauer gesagt: jedes Feld ist unterschiedlich. Allen identische Breite zu verpassen, wäre optisch sehr unschön.
mfg hRb
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1695
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 25.10.17 10:16 
Wie die Schriftart einzustellen ist, weisst du ja nun. Die Textbreite soll dir dabei helfen, die Abstände zwischen der aktuellen Caption, dem neuen Text und dem Shortcut (sofern gegeben) gleich zu halten. Das MainMenu würde im Idealfall so aussehen:
ausblenden Quelltext
1:
2:
3:
4:
|Datei|
 Neu      ABCDE Strg+N
 Öffnen   ABCDE Strg+O
 Einfügen ABCDE Strg+V

Wobei "ABCDE" stellvertretend für deine 5 zusätzlichen Zeichen steht.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108
Erhaltene Danke: 2



BeitragVerfasst: Mi 25.10.17 23:06 
Hallo Frühlingsrolle,
sieht alles so einfach aus, aber irgend etwas mache ich wohl falsch. Wenn ich versuche die Schriftart zu ändern, erscheint im Menü kein Text.
Als Dateianhang habe ich meine Befehlsfolge in ein Beispiel gepackt (ein Menü mit Datei, Bearbeiten, Suchen). Bei Datei und Bearbeiten habe ich das OnDrawItem-Ereignis gesetzt (mit Courier New). Ergebnis: kein Text. Bei Suchen setze ich das Ereignis nicht: Ergebnis: Text erscheint, aber natürlich dann nicht in CourierNew. Was ist falsch? (im Ordner Win32 steht die exe, übersetzt mit RAD-Studio 10.1 Berlin).
Gruß hRb
Einloggen, um Attachments anzusehen!
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Do 26.10.17 22:27 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich versuche die Schriftart zu ändern, erscheint im Menü kein Text.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.CustomMenu1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  ACanvas.Font.Name := 'Courier New';
end;

Das kann so nicht funktionieren. CustomMenu1DrawItem bezieht sich auf die oberste Menüzeile (Datei, Bearbeiten usw.). Du teilst dem Programm mit, was beim Zeichnen zu geschehen hat. Du setzt zwar den Font, was und wie als Text auszugeben ist, fehlt aber. Deshalb bleibt das Feld leer.

Um einen Menüeintag auszuwählen (Bearbeiten, Kopieren usw.), ist im Designmodus der Menüeintrag und im Objektinspektor das entsprechende Ereignis (OnDrawItem) auszuwählen.

Beispiel:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
// hier der Eintrag "Datei" in der obersten Menüzeile

procedure TMainform.Datei1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
var
  LeftPos: Integer;
  TopPos: Integer;
  TextLength: Integer;
  Text: string;
begin
  Text := (Sender as TMenuItem).Caption;
  ACanvas.Brush.Color := clRed;
  ACanvas.FillRect(ARect);
  ACanvas.Font.Color := clYellow;
  ACanvas.Font.Name := 'courier new';
  ACanvas.Font.Size := 12;
  ACanvas.Font.Style := [fsBold];
  TopPos := ARect.Top +
    (ARect.Bottom - ARect.Top - ACanvas.TextHeight('W')) div 2;
  TextLength := Length(Text);
  if TextLength > (ARect.Right - ARect.Left) then
    LeftPos := ARect.Left + 3
  else
    LeftPos := ARect.Left + (ARect.Right - ARect.Left -
      ACanvas.TextWidth(Text)) div 2;
  ACanvas.TextOut(LeftPos, TopPos, Text);
end;

// hier der dritte Menüeintrag unter "Datei"

procedure TMainform.est31DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
var
  LeftPos: Integer;
  TopPos: Integer;
  TextLength: Integer;
  Text: string;
begin
  Text := (Sender as TMenuItem).Caption;
  ACanvas.Brush.Color := clBlue;
  ACanvas.FillRect(ARect);
  ACanvas.Font.Color := clYellow;
  ACanvas.Font.Name := 'courier new';
  ACanvas.Font.Size := 12;
  ACanvas.Font.Style := [fsBold];
  TopPos := ARect.Top +
    (ARect.Bottom - ARect.Top - ACanvas.TextHeight('W')) div 2;
  TextLength := Length(Text);
  if TextLength > (ARect.Right - ARect.Left) then
    LeftPos := ARect.Left + 3
  else
    LeftPos := ARect.Left + (ARect.Right - ARect.Left -
      ACanvas.TextWidth(Text)) div 2;
  ACanvas.TextOut(LeftPos, TopPos, Text);
end;
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108
Erhaltene Danke: 2



BeitragVerfasst: Do 02.11.17 00:23 
Hallo Freunde,
Bei mir dauert es immer etwas länger. Aber ich biete nun eine Lösung, die allerdings noch Potential zu Verbesserungen bietet.
Zunächst: ich habe die oben erwähnte Idee zur Verwendung einer proportionalen Schrift aufgegeben (sieht nicht gut aus)

Welche Probleme waren zu lösen:
1. Benutzt man Canvas.textout, dann muss der Text von Caption, evtl. der ShortCut-Text und die gewünschte "zusätzliche Spalte" geschrieben werden. U.u. sind im vorderen Bereich auch noch kleine Icons zu berücksichtigen.
2. Verwendet jemand im Menü beim Text das Sonderzeichen "&" (=Kommando: Alt+Buchstabe), dann wird dieses Zeichen plötzlich sichtbar geschrieben.
3. Zur Festlegung, an welcher Position die zusätzliche Spalte geschrieben werden kann, ist ein zum Teil extrem langer ShortCut-Text zu berücksichtigen, z.B. "Umsch+Strg+F10". Demzufolge ist die Länge des maximalen Shortcut-Textes zu ermitteln (bei mir eine Konstante, da dies nicht notwendiger weise in der ersten Zeile der Fall ist).
4. Da der ShortCut-Text durch FillRect verloren geht, muss er neu abgeleitet oder gewonnen werden.
5. Die Breite des Pulldownmenüs ist standardmäßig durch Text und ShortCut vorgegeben. Soll nun eine zusätzliche Spalte entstehen, müsste eigentlich das Menu verbreitert werden - aber wie?

Wie sieht nun meine Lösung aus?
zu 1: Ich habe keine Icons, d.h. auch keine Lösung wie die erhalten bleiben. Ggf. müsste der Fenster vor dem Befehl ACanvas.FillRect(ARect) anders definiert werden
zu 2: Das Kaufmanns-Und-Zeichen "&" muss vor TextOut entfernt werden.
zu 3: Position der zusätzlichen Spalte bei mir: ARect.Width - 110 (Konstante).
zu 4: Den Parameter "ShortCut" im Pulldown des MainMenu1 ist selbst kein Text. Es gelang mir nicht diesen Parameter automatisiert zu interpretieren (als Text). Vielleicht hat hier jemand eine Lösung, was wünschenswert wäre. Ich verwende als Lösung den Parameter "Hint" im Pulldownmenü (wird m.E, für anderes nicht gebraucht) In Hint habe ich den Text der zusätzlichen Spalte und den ShortCutText, durch Komma getrennt, hinein geschrieben (der String wird im Programm wieder zerlegt.)
zu 5: Das Pulldown-Menü mit dem Befehl ARect.Width:=ARect.Width+120; zu verbreitern, verpufft wirkungslos. Mir ist nicht bekannt wie das Canvas-Fenster verbreitert werden kann ohne vom Normalmenü wieder korrigiert zu werden. Vielleicht hat auch hier jemand eine Lösung. Ich habe mir beholfen, in dem ich den Caption-Text solange mit Blank verlängert habe, bis das Menü breit genug war und Platz für die zusaätzliche Spalte bot.

Im beigefügten Programm-Beispiel habe ich nicht über all genug Blank eingefügt, um das "Problem" noch sichtbar zu machen. Auch wenn die Lösung derzeit noch Schwachstellen hat, ist es doch eine vollwertige Lösung. Würde mich über Echo freuen.
MfG hRb
PS: die beigefügte zip-Datei hat gleichen Name wie vorher. Alte zip-Datei also ggf. vorher löschen
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18529
Erhaltene Danke: 1577

W10 x64 (Chrome, IE11)
Delphi 10.1 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.11.17 06:19 
Der Vollständigkeit halber:
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
und verweist auf "https://codecentral.borland.com/codecentral/ccweb.exe/download?id=15770". Dieser Link funktioniert jedoch nicht mehr.
Wenn man in der URL borland durch embarcadero ersetzt und dann dort die Download-ID bei einem der aktuellen Downloads einsetzt, klappt es:
codecentral.embarcadero.com/Item/15770

_________________
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1695
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 02.11.17 13:31 
Ich vermute mal, man muss, bevor Änderungen vorgenommen werden, erst einmal die Informationen (Text u. Icons) mit der Funktion GetMenuItemInfo() erheben, im Anschluss .OwnerDraw = true setzen, mit der Funktion SetMenuItemInfo() den Text u. Icons setzen und den Text so nacheditieren, wie man ihn braucht.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)