Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Automatisierung (https://www.delphipraxis.net/193742-automatisierung.html)

EWeiss 4. Sep 2017 18:07

Automatisierung
 
Ich habe doch noch leichte Probleme mit dem Grund Menu.
Benötige da noch ein paar Ideen oder Hilfestellungen.

Es geht mir vor allem um die Automatisierung das Fenster dynamisch zu zerstören wenn es nicht mehr gebraucht wird.
Im Moment muss ich an vielen Positionen PopUpMenu.DestroyWindow aufrufen um das Fenster zu schließen.

Hat jemand eine Idee wie man das machen könnte das es dynamisch\Automatisiert abläuft oder es an nur einer stelle geschieht?
Wie macht das denn ein normales Menu denn da muss man nicht jedes Mal eine Funktion aufrufen welche das Fenster zerstört.

Alleine das erstellen ist schon aufwendig.
Hier mal der Code! (Nicht kopiert selbst erstellt) LOL!

Delphi-Quellcode:
procedure CreateMyPopUpMenu(WinHandle: HWND);
var
  PrivateFont: PWideChar;
begin
  PopUpMenu := CTRL_PopUpMenuCreate;
  PopUpMenu.Width := 215;
  PopUpMenu.Height := 366;
  PopUpMenu.SkinConfigFile := PWideChar(DefSkin);
  PopUpMenu.UseVistaCrystal := CheckCrystal.GetCheckButtonStatus(CheckCrystal.Handle);
  PopUpMenu.UseVistaBlur := CheckAeroBlur.GetCheckButtonStatus(CheckAeroBlur.Handle);
  PopUpMenu.SideBarCaption := 'KVideo Player';
  PopUpMenu.SideBarCaptionLeft := 5;
  PopUpMenu.SideBarCaptionTop := 245;

  gPMenu.hPopUpHandle := PopUpMenu.CreatePopUpMenu(MainHandle);
  if gPMenu.hPopUpHandle <> 0 then
  begin
    AddPopUpControls(gPMenu.hPopUpHandle);

    PrivateFont := PWideChar(SKAERO_FOLDER + 'Menu\SideBar.ttf');
    PopUpMenu.FontName := 'Nasalization Free';
    PopUpMenu.FontSize := 14;
    PopUpMenu.CreatePrivateFont(PrivateFont);

    gPMenu.PopUpMenu := gPMenu.hPopUpHandle;
    gPMenu.bPopupMenu := True;
  end;
end;
Delphi-Quellcode:
procedure AddPopUpControls(WinHandle: HWND);
var
  ImagePathSid: WideString;
  ImagePathSel: WideString;
  ImagePathSep: WideString;
  IconPath: WideString;
  IconArrowPath: WideString;
  Enabled: BOOL;
  Color: COLORREF;
begin
  // Icon Pfade
  ImagePathSel := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Select.png';
  ImagePathSep := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Seperator.png';
  ImagePathSid := SKAERO_CONFIG_GetSkinFolder + 'Menu\SideBar.png';
  IconArrowPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\Arrow.ico';

  // Aktiven Status prüfen und Farbe zuweisen
  Enabled := (KVideo_GetPlayerState <> psNotReady);
  if Enabled then
     Color := SKAERO_POPMENUHILITE
  else
  Color := $FF737373;

  // SeitenBar
  PopUpMenu.AddSideBar(WinHandle, IDM_SIDEBARFRAME, ImagePathSid,
    2, 2, 21, 362, 0, false, true);

  // About
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_About.ico';
  PopUpMenu.AddButton(WinHandle, IDM_ABOUT, ImagePathSel, IconPath, 'About',
    24, 2, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20,
    'Oops...' + CHR(13) + 'Are they in the wrong place?');

  // Seperator
  PopUpMenu.AddButton(WinHandle, IDM_SEPERATOR, ImagePathSep, '', '-Appearance-',
    24, 22, 189, 20, SKAERO_ACTIVECAPTION, 1, 0, Center, 20, '',false);

  // Skins
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SkinFolder.ico';
  PopUpMenu.AddButton(WinHandle, IDM_SKIN, ImagePathSel, IconPath, 'Skins',
    24, 42, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20, '', true, IconArrowPath);

  // Seperator
  PopUpMenu.AddButton(WinHandle, IDM_SEPERATOR1, ImagePathSep, '', '-VideoFilter-',
    24, 62, 189, 20, SKAERO_ACTIVECAPTION, 1, 0, Center, 20, '', false);

  // Filter
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Filter.ico';
  PopUpMenu.AddButton(WinHandle, IDM_FILTER, ImagePathSel, IconPath, 'Filter',
    24, 82, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20, '', true, IconArrowPath);

  // LAV Filter Configuration
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Filter.ico';
  PopUpMenu.AddButton(WinHandle, IDM_LAVFILTERCONFIG, ImagePathSel, IconPath,
    'LAV Filter Configuration', 24, 102, 189, 20, Color, 1, 0, Left, 20, '', Enabled,
    IconArrowPath);

  // Seperator
  PopUpMenu.AddButton(WinHandle, IDM_SEPERATOR2, ImagePathSep, '', '-File Dependencies-',
    24, 122, 189, 20, SKAERO_ACTIVECAPTION, 1, 0, Center, 20, '', false);

  // Add File
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_File.ico';
  PopUpMenu.AddButton(WinHandle, IDM_ADDFILE, ImagePathSel, IconPath, 'Add File',
    24, 142, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20, '');

  // Seperator
  PopUpMenu.AddButton(WinHandle, IDM_SEPERATOR3, ImagePathSep, '', '-Options-',
    24, 162, 189, 20, SKAERO_ACTIVECAPTION, 1, 0, Center, 20, '', false);

  // Settings
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Option.ico';
  PopUpMenu.AddButton(WinHandle, IDM_OPTION, ImagePathSel, IconPath, 'Settings',
    24, 182, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20, '', true, IconArrowPath);

  // SubTitle Config
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SubTitlecfg.ico';
  PopUpMenu.AddButton(WinHandle, IDM_SUBTITLECONFIG, ImagePathSel, IconPath, 'SubTitle Config',
    24, 202, 189, 20, Color, 1, 0, Left, 20, '', Enabled);

  // Show MediaFile Property
  if (KVideo_MediaInfoServiceReady) then
  begin
    Enabled := True;
    Color := SKAERO_POPMENUHILITE;
  end else
  if not(KVideo_GetMediaProperty(aMediaProperty)) then
  begin
    Enabled := false;
    Color := $FF737373;
  end;
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Info.ico';
  PopUpMenu.AddButton(WinHandle, IDM_MEDIAFILEPROPERTYS, ImagePathSel, IconPath,
    'Show MediaFile Property', 24, 222, 189, 20, Color, 1, 0, Left, 20, '', Enabled);

  // Select Video Track
  if (aMediaProperty.NumVideoStream = 0) then
  begin
    Enabled := false;
    Color := $FF737373;
  end else
  begin
    Enabled := True;
    Color := SKAERO_POPMENUHILITE;
  end;
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Video.ico';
  PopUpMenu.AddButton(WinHandle, IDM_VIDEOSTREAM, ImagePathSel, IconPath, 'Select Video Track',
    24, 242, 189, 20, Color, 1, 0, Left, 20, '', Enabled, IconArrowPath);

  // Select Audio Track
  if (aMediaProperty.NumAudioStream = 0) then
  begin
    Enabled := false;
    Color := $FF737373;
  end else
  begin
    Enabled := True;
    Color := SKAERO_POPMENUHILITE;
  end;
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Audio.ico';
  PopUpMenu.AddButton(WinHandle, IDM_AUDIOSTREAM, ImagePathSel, IconPath, 'Select Audio Track',
    24, 262, 189, 20, Color, 1, 0, Left, 20, '', Enabled, IconArrowPath);

  // Select SubTitle Track
  if (aMediaProperty.NumSubTitleStream = 0) then
  begin
    Enabled := false;
    Color := $FF737373;
  end else
  begin
    Enabled := True;
    Color := SKAERO_POPMENUHILITE;
  end;
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SubTitle.ico';
  PopUpMenu.AddButton(WinHandle, IDM_SUBTITLETRACK, ImagePathSel, IconPath,
    'Select SubTitle Track', 24, 282, 189, 20, Color, 1, 0, Left, 20, '', Enabled, IconArrowPath);

  // Chapter
  if (aMediaProperty.NumChapter = 0) then
  begin
    Enabled := false;
    Color := $FF737373;
  end else
  begin
    Enabled := True;
    Color := SKAERO_POPMENUHILITE;
  end;
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Chapter.ico';
  PopUpMenu.AddButton(WinHandle, IDM_CHAPTER, ImagePathSel, IconPath, 'Chapter',
    24, 302, 189, 20, Color, 1, 0, Left, 20, '', Enabled, IconArrowPath);

  // Seperator
  PopUpMenu.AddButton(WinHandle, IDM_SEPERATOR4, ImagePathSep, '', '-Application-',
    24, 322, 189, 20, SKAERO_ACTIVECAPTION, 1, 0, Center, 20, '', false);

  // Close
  IconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Close.ico';
  PopUpMenu.AddButton(WinHandle, IDM_CLOSE, ImagePathSel, IconPath, 'Close',
    24, 342, 189, 20, SKAERO_POPMENUHILITE, 1, 0, Left, 20, 'Bye, Bye');

end;
gruss

TiGü 5. Sep 2017 08:48

AW: Automatisierung
 
Zeig doch mal die Stelle, wo du CreateMyPopupMenu aufrufst. (Ist es eigentlich gewollt, dass zwar WinHandle übergeben, aber auf das globale MainHandle zugegriffen wird?)
Ich nehme an, dass geschieht in der Botschaftsbehandlung für WM_RBUTTONDOWN bzw -UP?

EWeiss 5. Sep 2017 09:04

AW: Automatisierung
 
Zitat:

Zitat von TiGü (Beitrag 1380339)
Zeig doch mal die Stelle, wo du CreateMyPopupMenu aufrufst.
Ich nehme an, dass geschieht in der Botschaftsbehandlung für WM_RBUTTONDOWN bzw -UP?

Nicht ganz.

Main WinProc.
Delphi-Quellcode:
    WM_NCRBUTTONDOWN:
      begin
          if gPMenu.bPopupMenu then
          begin
            gPMenu.bPopupMenu := false;
            PopUpMenu.DestroyWindow;
          end;

          CreatePopupMenu(Prop.MainHandle);

          GetCursorPos(P);
          GetWindowRect(gPMenu.PopUpMenu, rc);
          ClientToScreen(gPMenu.PopUpMenu, P);

          PopUpMenu.MoveWindow(gPMenu.PopUpMenu, P.X, (P.Y - rc.Bottom), rc.Right,
            rc.Bottom);

          PopupMenu.Show;

          while GetMessage(_Msg, 0, 0, 0) do
          begin
            TranslateMessage(_Msg);
            DispatchMessage(_Msg);
          end;

          if OnExit then
            PostMessage(WinHandle, WM_DESTROY, 0, 0);
      end;
Delphi-Quellcode:
    WM_NCLBUTTONDOWN:
      begin
        IsMoving := true;
        if gPMenu.bPopupMenu then
        begin
          PopUpMenu.DestroyWindow;
          gPMenu.bPopupMenu := false;
        end;
      end;
MovieProc
Delphi-Quellcode:
    WM_RBUTTONDOWN:
      SendMessageW(Prop.MainHandle, WM_NCRBUTTONDOWN, wP, LP);

    WM_LBUTTONDOWN:
      SendMessageW(Prop.MainHandle, WM_NCLBUTTONDOWN, wP, LP);
Zitat:

(Ist es eigentlich gewollt, dass zwar WinHandle übergeben, aber auf das globale MainHandle zugegriffen wird?)
Wo siehst du das?


gruss

Neutral General 5. Sep 2017 09:09

AW: Automatisierung
 
Zitat:

Zitat von EWeiss (Beitrag 1380341)
Zitat:

(Ist es eigentlich gewollt, dass zwar WinHandle übergeben, aber auf das globale MainHandle zugegriffen wird?)
Wo siehst du das?

Delphi-Quellcode:
procedure CreateMyPopUpMenu(WinHandle: HWND);
begin
  // ...
  gPMenu.hPopUpHandle := PopUpMenu.CreatePopUpMenu(MainHandle);

EWeiss 5. Sep 2017 09:18

AW: Automatisierung
 
Zitat:

Zitat von Neutral General (Beitrag 1380344)
Zitat:

Zitat von EWeiss (Beitrag 1380341)
Zitat:

(Ist es eigentlich gewollt, dass zwar WinHandle übergeben, aber auf das globale MainHandle zugegriffen wird?)
Wo siehst du das?

Delphi-Quellcode:
procedure CreateMyPopUpMenu(WinHandle: HWND);
begin
  // ...
  gPMenu.hPopUpHandle := PopUpMenu.CreatePopUpMenu(MainHandle);

Ahh danke ;)
Nein das soll nicht so sein habe es behoben. Danke
Auch in WM_NCRBUTTONDOWN:

gruss

Sherlock 5. Sep 2017 13:34

AW: Automatisierung
 
Leicht OT: Codereviews sind schon geil! Wäre es nicht schön/sinnvoll ein entsprechendes Unterforum zu haben? ICh würde da auch ein bis zwei Dinge reinstellen können 8-).

Sherlock

EWeiss 5. Sep 2017 14:10

AW: Automatisierung
 
Habe es jetzt erst mal noch etwas angepasst damit es sich mehr an das normale Menu orientiert.

Delphi-Quellcode:
procedure AppendMenu(WinHandle: HWND);
var
  Enabled: BOOL;
  Color: COLORREF;
begin

  // Aktiven Status prüfen und Farbe zuweisen
  Enabled := (KVideo_GetPlayerState <> psNotReady);
  if Enabled then
     Color := SKAERO_POPMENUHILITE
  else
  Color := $FF737373;

   if gPMenu.hPopUpHandle <> 0 then
  begin
    // About
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_About.ico';
    PopUpMenu.ItemToolTip := 'Oops...' + CHR(13) + 'Are they in the wrong place?';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 2;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW, IDM_About, 'About');

    // Seperator
    PopUpMenu.ItemHiliteColor := SKAERO_ACTIVECAPTION;
    PopUpMenu.ItemTextAlligment := Center;
    PopUpMenu.ItemEnabled := False;
    PopUpMenu.ItemTop := 22;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_SEPARATOR, IDM_SEPERATOR, '-Appearance-');

    // Skins
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SkinFolder.ico';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 42;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_SKIN, 'Skins');

    // Seperator
    PopUpMenu.ItemHiliteColor := SKAERO_ACTIVECAPTION;
    PopUpMenu.ItemTextAlligment := Center;
    PopUpMenu.ItemEnabled := False;
    PopUpMenu.ItemTop := 62;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_SEPARATOR, IDM_SEPERATOR1, '-VideoFilter-');

    // Filter
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Filter.ico';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 82;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_FILTER, 'Filter');

    // LAV Filter Configuration
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Filter.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 102;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_LAVFILTERCONFIG, 'LAV Filter Configuration');

    // Seperator
    PopUpMenu.ItemHiliteColor := SKAERO_ACTIVECAPTION;
    PopUpMenu.ItemTextAlligment := Center;
    PopUpMenu.ItemEnabled := False;
    PopUpMenu.ItemTop := 122;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_SEPARATOR, IDM_SEPERATOR2, '-File Dependencies-');

    // Add File
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_File.ico';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 142;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW, IDM_ADDFILE, 'Add File');

    // Seperator
    PopUpMenu.ItemHiliteColor := SKAERO_ACTIVECAPTION;
    PopUpMenu.ItemTextAlligment := Center;
    PopUpMenu.ItemEnabled := False;
    PopUpMenu.ItemTop := 162;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_SEPARATOR, IDM_SEPERATOR3, '-Options-');

    // Settings
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Option.ico';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 182;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_OPTION, 'Settings');

    // SubTitle Config
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SubTitlecfg.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 202;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW, IDM_SUBTITLECONFIG, 'SubTitle Config');

    // Show MediaFile Property
    if (KVideo_MediaInfoServiceReady) then
    begin
      if not(KVideo_GetMediaProperty(aMediaProperty)) then
      begin
        Enabled := false;
        Color := $FF737373;
      end else
      begin
        Enabled := True;
        Color := SKAERO_POPMENUHILITE;
      end;
    end else
    begin
      Enabled := false;
      Color := $FF737373;
    end;
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Info.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 222;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW, IDM_MEDIAFILEPROPERTYS, 'Show MediaFile Property');

    // Select Video Track
    if (aMediaProperty.NumVideoStream = 0) then
    begin
      Enabled := false;
      Color := $FF737373;
    end else
    begin
      Enabled := True;
      Color := SKAERO_POPMENUHILITE;
    end;
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Video.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 242;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_VIDEOSTREAM, 'Select Video Track');

    // Select Audio Track
    if (aMediaProperty.NumAudioStream = 0) then
    begin
      Enabled := false;
      Color := $FF737373;
    end else
    begin
      Enabled := True;
      Color := SKAERO_POPMENUHILITE;
    end;
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Audio.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 262;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_AUDIOSTREAM, 'Select Audio Track');

    // Select SubTitle Track
    if (aMediaProperty.NumSubTitleStream = 0) then
    begin
      Enabled := false;
      Color := $FF737373;
    end else
    begin
      Enabled := True;
      Color := SKAERO_POPMENUHILITE;
    end;
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_SubTitle.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 282;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_SUBTITLETRACK, 'Select SubTitle Track');

    // Chapter
    if (aMediaProperty.NumChapter = 0) then
    begin
      Enabled := false;
      Color := $FF737373;
    end else
    begin
      Enabled := True;
      Color := SKAERO_POPMENUHILITE;
    end;
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Chapter.ico';
    PopUpMenu.ItemHiliteColor := Color;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemEnabled := Enabled;
    PopUpMenu.ItemTop := 302;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_CHAPTER, 'Chapter');

    // Seperator
    PopUpMenu.ItemHiliteColor := SKAERO_ACTIVECAPTION;
    PopUpMenu.ItemTextAlligment := Center;
    PopUpMenu.ItemEnabled := False;
    PopUpMenu.ItemTop := 322;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_SEPARATOR, IDM_SEPERATOR4, '-Application-');

    // Close
    PopUpMenu.ItemIconPath := SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_Close.ico';
    PopUpMenu.ItemToolTip := 'Bye, Bye';
    PopUpMenu.ItemHiliteColor := SKAERO_POPMENUHILITE;
    PopUpMenu.ItemTextAlligment := Left;
    PopUpMenu.ItemTop := 342;
    PopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW, IDM_CLOSE, 'Close');
  end;

end;
gruss

bra 5. Sep 2017 14:36

AW: Automatisierung
 
Wenn du die einzelnen Aufrufe in einer Funktion verpackst, schrumpft der Code um ein Vielfaches:

Code ist unvollständig und die Parameter müssen ggf. noch ergänzt werden.

Delphi-Quellcode:
procedure AppendEntry(APopUpMenu, AIconPath, AHiliteColor, ATextAlignment, AEnabled, ATop, ACaption);
begin
    APopUpMenu.ItemIconPath := AIconPath;
    APopUpMenu.ItemHiliteColor := AHiliteColor;
    APopUpMenu.ItemTextAlligment := ATextAlignment;
    APopUpMenu.ItemEnabled := AEnabled;
    APopUpMenu.ItemTop := ATop;
    APopUpMenu.AppendMenu(PopUpMenu.Handle, MF_OWNERDRAW or MF_POPUP, IDM_CHAPTER, ACaption);
end;

EWeiss 5. Sep 2017 14:50

AW: Automatisierung
 
jo könnte man machen
Mache ich aber nicht weil der Kram dann total unleserlich wird.

gruss

bra 5. Sep 2017 14:57

AW: Automatisierung
 
Stimmt, 10 Zeilen Code sind unleserlicher als 50 Zeilen mit immer den selben Aufrufen :thumb:

EWeiss 5. Sep 2017 15:07

AW: Automatisierung
 
Zitat:

Zitat von bra (Beitrag 1380366)
Stimmt, 10 Zeilen Code sind unleserlicher als 50 Zeilen mit immer den selben Aufrufen :thumb:

Würde mal lesen da ist mit nichten immer der selbe Aufruf.
Das soll leserlich sein?

Delphi-Quellcode:
AppendEntry(SKAERO_CONFIG_GetSkinFolder + 'Menu\MEN_About.ico';,'Oops...' + CHR(13) + 'Are they in the wrong place?',SKAERO_POPMENUHILITE,2)
usw.. Das alles in eine Zeile geklatscht ?

Das ist ja so was von!
Lieber 50 Zeilen als alles in einer rein gematscht. stört mich nicht weiter.

gruss

TigerLilly 6. Sep 2017 09:48

AW: Automatisierung
 
Lach. Spaghetticode.

Im Ernst: Mach es, wie bra es empfohlen hat. Das was du da produzierst ist "toxischer Code".

Merke: Spaghetticode ist giftig :-)

EWeiss 6. Sep 2017 09:57

AW: Automatisierung
 
Zitat:

Merke: Spaghetticode ist giftig
Merke deine Beiträge sind giftig.
Komm mal etwas von deinem hohen Ross herunter.

Wie ich es mache liegt in meinem ermessen und das lasse ich mir von dir nicht diktieren.

gruss

TigerLilly 6. Sep 2017 10:11

AW: Automatisierung
 
Ach komm schon. Manche von uns wissen schon, wovon sie reden. :-)

https://sourcemaking.com/antipatterns/spaghetti-code
https://jaxenter.de/die-gefahren-des...tti-code-20872

EWeiss 6. Sep 2017 10:15

AW: Automatisierung
 
Zitat:

Zitat von TigerLilly (Beitrag 1380394)

Wo ist dein Problem..
bzw.. deine Stärken in der Angriffslust? Deshalb wohl der Name Tiger im Nick.

Also laber mir hier nicht die Taschen voll und komme zum Thema zurück.
Wenn du dazu etwas sinnvolles (Manche von uns wissen schon, wovon sie reden) beitragen kannst würde es mich freuen
ansonsten vergiss es einfach.

Wieder ein fall für meine Ignore Liste.

gruss

nahpets 6. Sep 2017 11:28

AW: Automatisierung
 
Sinnvoll ist es, den Vorschlag von bra zu befolgen.

Der Code wird kürzer und deutlich weniger fehleranfällig, da sich potenzielle Fehlerquellen auf die Prozedure AppendEntry beschränken und nicht wiederholt im Quelltext gefunden und behoben werden müssen.

Es ist Dein gutes Recht, dem Vorschlag nicht zu folgen, aber es ist nicht unbedingt die feine Art, jeden, der eine andere Meinung als Du vertritt, sofort zu unterstellen, er würde Dich angreifen.

Es sind lediglich gutgemeinte Ratschläge, die oft aus jahrzehntelanger Erfahrung resultieren.

Man kann ihnen folgen, muss es aber nicht.

Und zum Thema "Automatisierung" gehören genau solche Verbesserungen dazu, da man das Werkzeug, den Automaten (hier die von bra vorgeschlagene Prozedure) wiederholt verwenden kann. Und genau das ist einer der wesentlichen Gründe der Automatisierung.

Schau Dir einfach mal die Automatisierung in der Industrie an: Dort gibt es bestimmte Abläufe (Prozeduren) die nur eine kleine Teilmenge einer Aufgabe immer wieder ausführen und das und sonst nichts anderes können. Davon dann eine ausreichende Anzahl sich ergänzender Verarbeitungsschritte hintereinander und schon läuft die Automatisierung an Anfang bis Ende.

Programmierung ist nichts anderes, als eine Abfolge von Verarbeitungsschritten hintereinander zustellen, Wiederholungen in Funktionen / Prozeduren zu kapseln und als Ergebnis eine Abfolge von Verarbeitungsschritten zur Erreichung eines bestimmten Zieles zu bekommen.

EWeiss 6. Sep 2017 11:43

AW: Automatisierung
 
Zitat:

Schau Dir einfach mal die Automatisierung in der Industrie an:
Das war nicht meine Frage.

Zitat:

Es ist Dein gutes Recht, dem Vorschlag nicht zu folgen, aber es ist nicht unbedingt die feine Art, jeden, der eine andere Meinung als Du vertritt, sofort zu unterstellen, er würde Dich angreifen.
Wenn mir jemand so wie du jetzt sachlich belegen kann warum und weshalb es besser ist, ist das eine Sache und dann kann man dem nach gehen
in welcher Form man das für gute hält.

Wenn mir aber jemand mit blöden Sprüchen kommt ala Spagetti Code und ähnlichen (was absolut nicht sachlich ist) stellt das einen angriff gegen meine Person dar wie ihr das auch immer betrachten mögt.

Auf so einen Ja SEHR Deutlich gesprochen Klugscheiß kann ich verzichten.
Aber ich will mich jetzt nicht wegen solche Kleinigkeiten wie ich in meinem Code die Variablen weiter reiche hier rumstreiten.
Zu meinem eigentlichen Problem hatte bisher noch niemand etwas beizutragen..

Damit das hier nicht ausartet und ich eh keine Sachliche Hilfestellung bzg. meiner Frage bekomme
kann man diesen Thread bitte schießen bevor das ganze hier noch ausartet.

gruss

madas 6. Sep 2017 12:05

AW: Automatisierung
 
Zitat:

Zitat von EWeiss (Beitrag 1380408)
Wenn mir aber jemand mit blöden Sprüchen kommt ala Spagetti Code und ähnlichen (was absolut nicht sachlich ist) stellt das einen angriff gegen meine Person dar wie ihr das auch immer betrachten mögt.

Wenn Du Deinen Code selber als "Kram" bezeichnest, brauchst Du Dich doch nicht über die ernst gemeinten Hinweise der anderen zu beschweren.

nahpets 6. Sep 2017 12:11

AW: Automatisierung
 
Zitat:

Zitat von EWeiss (Beitrag 1380408)
Zitat:

Schau Dir einfach mal die Automatisierung in der Industrie an:
Das war nicht meine Frage.

Doch, durchaus, denn aus der Industrie stammt die Automatisierung. Man spricht halt inzwischen auch in anderen Umfeldern von Automatisierung, wenn man etwas vereinfachen möchte bzw. sich etwas quasi "von allein erledigt".

Zitat:

Zitat von EWeiss (Beitrag 1380408)
Wenn mir aber jemand mit blöden Sprüchen kommt ala Spagetti Code und ähnlichen (was absolut nicht sachlich ist) stellt das einen angriff gegen meine Person dar wie ihr das auch immer betrachten mögt.

Spagetti Code ist für mich kein blöder Spruch, sondern ein Hinweis darauf, dass da was verbesserungswürdig sein könnte. Bin persönlich für derartige Hinweise immer dankbar, da man selbst sowas nicht zwingend im eigenen Code sofort erkennt. Und ich kenne keinen Programmierer, der keinen Spagetticode schreibt. Er entsteht fast immer, bis man beim Programmieren erkennt, dass man eine bestimmte Aufgabe wiederholt benötigt (was vorher weiß Gott nicht immer klar ist). Oder man erkennt, dass eine bestimmte Aufgabe hervorragend kapselbar ist ...

Zitat:

Zitat von EWeiss (Beitrag 1380408)
Auf so einen Ja SEHR Deutlich gesprochen Klugscheiß kann ich verzichten.

Bisher hab' ich hier in dem Thread keinen Klugscheiß erkennen können, lediglich unterschiedliche Ideen und Hinweise, die mal mehr mal weniger salopp oder förmlich geäußert wurden. Aber einen Grund, sich persönlich angegriffen zu fühlen, kann ich nicht erkennen.
Vielleicht liegt es auch daran, dass ich mir im Laufe der Jahrzehnte eine gewisse "Grundgelassenheit" angeeignet habe, die vieles nicht mehr so eng sieht und bei Aussagen anderer immer erstmal davon ausgeht, dass es nicht bös gemeint ist, auch wenn man es eventuell so auslegen könnte ;-)

EWeiss 6. Sep 2017 12:11

AW: Automatisierung
 
Zitat:

Zitat von madas (Beitrag 1380411)
Zitat:

Zitat von EWeiss (Beitrag 1380408)
Wenn mir aber jemand mit blöden Sprüchen kommt ala Spagetti Code und ähnlichen (was absolut nicht sachlich ist) stellt das einen angriff gegen meine Person dar wie ihr das auch immer betrachten mögt.

Wenn Du Deinen Code selber als "Kram" bezeichnest, brauchst Du Dich doch nicht über die ernst gemeinten Hinweise der anderen zu beschweren.

Was ich mir selbst antue hat damit überhaupt nichts zu tun.
Fein das du dein Statement auch noch abgegeben hast.

Vielleicht besteht ja noch die Hoffnung das der Thread endlich geschlossen wird.
Diese blöden Kommentare gehen mir auf den Geist.
Oder tobt euch noch was aus, werde das Thema aus meinen Abonnements entfernen dann nerven die Emails wenigsten nicht mehr.

gruss

Neutral General 6. Sep 2017 12:15

AW: Automatisierung
 
Aus irgendeinem Grund driften hauptsächlich deine Threads immer so extrem ab :gruebel: :glaskugel:

Kritik und Verbesserungsvorschläge sind normalerweise nicht böse gemeint und dafür gedacht dir die Möglichkeit zu geben ein besserer Programmierer zu werden.
Du beharrst jedes mal nur stur auf deinen Code und empfindest jede gut gemeinte Kritik als persönlichen Angriff.

Das führt dazu, dass du unterm Strich nicht besser wirst und immer mehr Leute erst gar nicht mehr versuchen dir bei deinem Problem oder/und dabei ein besserer Programmierer zu werden zu helfen.

Und "ein besserer Programmierer werden" meine ich nicht abwertend. Jeder hier im Forum kann immer noch ein besserer Programmierer werden als er ist.

Sherlock 6. Sep 2017 12:28

AW: Automatisierung
 
Und ganz kurz noch: Der Begriff Spaghetticode ist kein persönlicher Angriff, sondern ein definierter Begriff, der eventuell als Abwertung dem Code gegenüber verstanden werden kann, aber keinesfalls eine Beleidigung darstellt. Er entspricht einem Anti-Entwurfsmuster, das es zu vermeiden gilt. Wenn es viele ähnliche Codeblöcke gibt, muss man bei jeder Änderung die Blöcke alle ändern, und könnte dabei den einen oder anderen übersehen, was spätestens dann zu unvorhersehbaren, schwer zu lokalisierenden Fehlern führen kann.

Eine weitere Facette des Problems hast Du selbst bemerkt, als Du Deine Frage hier gepostet hast, dieser längliche Code ist einfach unübersichtlich, und relevante Teile nur schwer auszumachen, weil alles in seiner Wiederholung irgendwie relevant ist. Damit wird es umso schwerer sachdienliche Hinweise zu geben, weil man sich erst durch das wirklich umfangreiche Beispiel arbeiten muss. Ein Problem kann in der Regel einfacher erkannt werden, wenn man ein eng umrissenes aber in sich abgeschlossenes Beispiel dazu gibt. Die Vorschläge, den Code zu verkürzen waren sicherlich erste Versuche, und mit etwas Zeit und Geduld bekommt man dann Lösungen, die für alle akzeptabel und verständlich sind. Aber Du mußt zugeben, daß die gleiche Änderung an 20 Stellen durchführen zu müssen, schlechter ist, als besagte Änderung nur einmal machen zu müssen. Und dafür einen etwas komplexeren Funktionsaufruf zu basteln halte ich für einen akzeptablen Preis. Dein Gegenbeispiel muss ja nicht so aussehen, es sollte noch nicht mal so werden, denn für alle die dort verwendeten Strings sollte man eigentlich Konstanten verwenden können, die einen entsprechend knackig kurzen Namen erhalten.

Delphi-Quellcode:
AppendEntry(cMenuAboutIco, rsWrongPlaceMessage, SKAERO_POPMENUHILITE, 2);
Das ist doch schnucklig und verständlich.

Und dann kann man sich endlich Deinem eigentlichen Problem widmen, weil man jetzt den Wald trotz der ganzen Bäume sieht.

Sherlock

mkinzler 6. Sep 2017 13:19

AW: Automatisierung
 
Der Thread wird auf Wunsch des TE geschlossen


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 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