Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 13.09.21 19:00 
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?

ausblenden 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
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: Mo 13.09.21 21:19 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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?
ausblenden Delphi-Quelltext
1:
var aShortCutArray: TArray<TShortCut>					

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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?
ausblenden Delphi-Quelltext
1:
var aShortCutArray: TArray<TShortCut>					
Muss ich mir ansehen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
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: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 14.09.21 17:57 
Danke, es funktioniert! :D
Hier die fertigen Methoden:

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:
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;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!