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); 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
galagher hat folgendes geschrieben : |
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); 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
jaenicke hat folgendes geschrieben : |
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.
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
jaenicke hat folgendes geschrieben : | 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; aMenuItem[i].ShortCut := ShortCut(Word(#255), []); 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 for i := 0 to High(aShortCutArray) do aMenuItem[i].ShortCut := aShortCutArray[i];
except Result := False; end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!