Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 16.10.17 20: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 18: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: 267
Erhaltene Danke: 12



BeitragVerfasst: Di 24.10.17 23: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 25.10.17 08:39 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mi 25.10.17 11: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 25.10.17 11:16 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 26.10.17 00: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 23: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: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 02.11.17 01: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: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.11.17 07: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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.11.17 14:31 
- Nachträglich durch die Entwickler-Ecke gelöscht -