Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array of TShortCut als Prozedurparameter und SetLength


galagher - Mo 13.09.21 19:00
Titel: Array of TShortCut als Prozedurparameter und SetLength
Hallo zusammen!

Ich möchte die ShortCuts aus einem MenuItem in einem Array of TShortCut sichern und dann entfernen. Warum gibt der Compiler hier die Fehlermeldung "Inkompatible Typen" aus?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.RemoveShortCuts(const aMenuItem: TMenuItem;
  const aShortCutArray: Array of TShortCut);
var
  i: Integer;
begin
  SetLength(aShortCutArray, aMenuItem.Count);  //<- Hier die Fehlermeldung!
//...
end;

Ich muss doch dem Array die Länge zuweisen, damit ich es mit den ShortCuts von aMenuItem befüllen kann! Wie kann ich das denn sonst machen?


jaenicke - Mo 13.09.21 21:19

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.RemoveShortCuts(const aMenuItem: TMenuItem;
  const aShortCutArray: Array of TShortCut);
var
  i: Integer;
begin
  SetLength(aShortCutArray, aMenuItem.Count);  //<- Hier die Fehlermeldung!
//...
end;
Ein konstantes Array kann man nicht in der Größe verändern, schon gar nicht als Open Array Parameter.

Wie wäre es mit einem Parameter wie diesem?

Delphi-Quelltext
1:
var aShortCutArray: TArray<TShortCut>                    


galagher - Mo 13.09.21 21:30

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ein konstantes Array kann man nicht in der Größe verändern, schon gar nicht als Open Array Parameter.
Es ist egal, ob konstant oder nicht. Auch, wenn mann const weglässt, meckert der Compiler.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie wäre es mit einem Parameter wie diesem?

Delphi-Quelltext
1:
var aShortCutArray: TArray<TShortCut>                    
Muss ich mir ansehen!


jaenicke - Mo 13.09.21 21:33

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ein konstantes Array kann man nicht in der Größe verändern, schon gar nicht als Open Array Parameter.
Es ist egal, ob konstant oder nicht. Auch, wenn mann const weglässt, meckert der Compiler.
Ja, ich weiß, deshalb der Hinweis auf das Stichwort "Open Array Parameter". Wenn du einen Typen TShortcutArray = array of TShortcut deklarierst und dort verwendest, geht es auch.

Aber heute macht es sowieso Sinn gleich Generics zu verwenden.


galagher - Di 14.09.21 17:57

Danke, es funktioniert! :D
Hier die fertigen Methoden:


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:
var
  ShortCutArray: TArray<TShortCut>;

//..

procedure DeleteShortCuts(const aMenuItem: TMenuItem;
  var aShortCutArray: TArray<TShortCut>);
var
  i: Integer;
begin
  SetLength(aShortCutArray, aMenuItem.Count);

  for i := 0 to aMenuItem.Count-1 do
  begin
    if not (aMenuItem[i].ShortCut = Word(#255)) then
    begin
      aShortCutArray[i] := aMenuItem[i].ShortCut;  {ShortCut sichern}
      aMenuItem[i].ShortCut := ShortCut(Word(#255), []);  {ShortCut entfernen}
    end;
  end;
end;

function RestoreShortCuts(const aMenuItem: TMenuItem;
  var aShortCutArray: TArray<TShortCut>): Boolean;
var
  i: Integer;
begin
  Result := False;

  if aMenuItem.Count-1 <> High(aShortCutArray) then
    exit;

  Result := True;

  try  {ShortCuts wiederherstellen}
    for i := 0 to High(aShortCutArray) do
      aMenuItem[i].ShortCut := aShortCutArray[i];

  except
    Result := False;
  end;
end;