Hallo community,
ich verwende dxgettext zum Übersetzen meines Programms. Nachdem ich mich mehrere Tage mit den Versuchen zur Lösung dieses Bugs beschäftigt habe, muss ich die Icons in meinem MainMenu explizit über die TMenuItem.Bitmap lösen; TImageList scheidet aus.
TL;DR: MainMenu-Items sind *viel* breiter als sonst, alles sieht komisch aus. Es liegt definitiv an der TImageList des MainMenus. Auch die u.g. Lösung brachte keine Besserung. Auch TP_GlobalIgnoreClass von TMainMenu, TImageList etc bringen keine Besserung. (Bitte diesen Bug jetzt nicht hier diskutieren, danke!) Ich kann also keine ImageList in TMainMenu verwenden ohne das Problem! Anderes Thema, nur zum Hintergrund warum/DASS ich keine TImageList verwenden kann!
Zitat:
Netzschleicher 25. März 2012, 12:29
Hallo alle zusammen,
bevor ich mich nun mit dem Fahrrad in die Sonne stürze wollte ich noch eine Frage loswerden.
In meinem Programm das ich schreibe verwende ich gnugettext um das ganze mehrsprachig zu machen. Das funktioniert auch soweit sehr gut. Nur habe ich jetzt ein Problem mit dem TMainMenu. Dieses MainMenu wird beim Programmstart dynamisch aufgebaut. Dafür habe ich zur Designzeit einfach eine TMainMenu-Komponente auf die Form gezogen und erstelle nur noch die nötigen Einträge.
Das Problem ist nun folgendes, wenn ich nun erst das Menü erzeuge und dann mit der gnugettext-Funktion 'TranslateComponent' die Form übersetze erscheint das Menü im alten WinXP-Design. Wenn ich 'TranslateComponent' vor dem erzeugen des Menü ausführe und die Menüeinträge mit z.B. ' MainItem->Caption = _(ACaption)' erzeuge, habe ich das Menü im schönen Design von Windows7. Wenn ich allerdings zur Laufzeit die Sprache ändere und dann mit 'RetranslateComponent' die Form wieder übersetze habe ich wieder nur das alte WinXP-Design meines MainMenüs.
Auch das versuchweise verwenden des Jvgnugettext der
Jedi-Komponenten brachte keine Besserung.
Kann mir da jemand einen Tipp geben wie dieses Problem umgangen werden kann? Ich dachte schon an die Möglichkeit, bei jeder Änderung der Sprache das Menü zu löschen und wieder neu aufzubauen.
Vielen Dank in Voraus,
Grüße Netzschleicher
Netzschleicher 27. März 2012, 19:30
So, ich habe mir das ganze nochmal in einer Testanwendung zusammengesteckt und dabei herausgefunden, das es an der TImageList zu liegen scheint. Wenn dem TMainMenu keine ImageList zugewiesen ist funktioniert alles prima. Wenn ich aber eine TImageList dem TMainMenu zuweise, gibt es beim Überstetzen die geschilderten Probleme.
Ich habe mir jetzt folgendermaßen geholfen:
MainMenu->Images = NULL;
UseLanguage(ConfigReadString("Environment", "Language", ""));
TranslateComponent(this);
MainMenu->Images = MenuImageList;
Ich möchte einfach nur ein bestehendes TBitmap in einem MenuItem anzeigen lassen. Alles Tips aus dem Internet laufen mit meinem Delphi 10.4 leider nicht; das Problem beschreiben aber auch andere User mit älteren Versionen von Delphi.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
Bmp1 := TPicture.Create;
Bmp1.LoadFromFile('c:\test.bmp');
Bmp1.Bitmap.Width := GetSystemMetrics(SM_CXMENUCHECK);
Bmp1.Bitmap.Height := GetSystemMetrics(SM_CYMENUCHECK);
SetMenuItemBitmaps(MainMenu1.Handle, 0, MF_BYPOSITION,
Bmp1.Bitmap.Handle, Bmp1.Bitmap.Handle);
Die erneute Zuweisung Breite/Höhe nur, dass es nicht daran scheitert, dass das Bild in einer falschen Größe wäre... Bitte einfach ignorieren, ist nur zum testen...
Hier ist es auch egal, ob ich MainMenu1.Handle verwende oder MeinMenuItem1.Handle. Es wird nichts sichtbar.
Wenn ich im Objektinspektor zur Designzeit das Bitmap zuweise, geht es direkt. Woran liegt's, was kann man tun.
Wie gesagt, ImageList scheidet aus.
Danke!
Edit:
Delphi-Quellcode:
procedure TGraphicResourceProvider.SetIconOnMenuItem(_ResourceName: string; _MenuItem: TMenuItem);
var
bmp: Graphics.TBitmap;
pic: TPicture;
tmpParent: TMenuItem;
tmpPos: integer;
begin
if not assigned(_MenuItem) then Exit;
_ResourceName := trim(_ResourceName);
pic := GetResourcePNGImageFromRCDATA(_ResourceName);
if (not assigned(pic)) or (_ResourceName = '') then begin
Exit;
end;
bmp := graphics.TBitmap.create;
bmp.SetSize(GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK));
bmp.Canvas.Draw(0, 0, pic.Graphic);
_MenuItem.Bitmap.Assign(bmp);
FreeAndNil(bmp);
tmpParent := _MenuItem.Parent;
if assigned(tmpParent) then begin
tmpPos := tmpParent.IndexOf(_MenuItem);
tmpParent.Remove(_MenuItem);
tmpParent.Insert(tmpPos, _MenuItem);
end;
So würde es gehen, da das Bild wohl nur mit dem Parent.Remove/Insertgeladen wird? Geht das nicht auch "richtig", ohne WorkArounds oder OwnerDraw?
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit