String in Array-Index

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

String in Array-Index

Beitrag von Mathias »

Dank pas2js habe ich etwas ganz kurriges entdeckt.
Bei einem Array-Index sind auch Strings möglich.
Es kommt mir da jetzt keine sinnvolle Anwendung in den Sinn, ausser bei einer externen pas2js-classe.
Vielleicht weis einer von euch etwas ?

Code: Alles auswählen

type
  TTestObject = class(TObject)
  private
    function GetProperties(Name: string): integer;
    procedure SetProperties(Name: string; AValue: integer);
  public
    property Properties[Name: string]: integer read GetProperties write SetProperties; default;
  end;

  { TJSObject }

  function TTestObject.GetProperties(Name: string): integer;
  var
    err: integer;
  begin
    val(Name, Result, err);
  end;

  procedure TTestObject.SetProperties(Name: string; AValue: integer);
  begin
    WriteLn(AValue);
    //     Properties[Name]:=123467;
  end;

var
  test: TTestObject;

begin
  test := TTestObject.Create;
  WriteLn(test['1234']);

  test['blabla'] := 4567;
end. 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: String in Array-Index

Beitrag von PascalDragon »

Mathias hat geschrieben:
Sa 13. Jan 2024, 19:56
Dank pas2js habe ich etwas ganz kurriges entdeckt.
Bei einem Array-Index sind auch Strings möglich.
Du hast also noch nie wirklich die Values Eigenschaft einer TStringList benutzt?

Und nur falls es dich überraschen sollte: es können auch mehrere Indices genutzt werden. Zum Beispiel hat das TCustomStringGrid die Eigenschaft Cells:

Code: Alles auswählen

    property Cells[Col, Row: Integer]: String read GetCells write SetCells;
(und nein, nicht alle Indices einer Indexeigenschaft müssen vom gleichen Typ sein)
FPC Compiler Entwickler

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: String in Array-Index

Beitrag von Mathias »

Du hast also noch nie wirklich die Values Eigenschaft einer TStringList benutzt?
Nein, habe ich nicht, daher habe ich gerade folgendes probiert, aber es kommt nur ein Leeestring raus.

Code: Alles auswählen

var
  sl: TStringList;
  s: string;
begin
  sl := TStringList.Create;
  sl.Add('111');
  sl.Add('222');
  sl.Add('333');
  sl.Add('123456');
  s := sl.Values['56'];
  WriteLn(Length(s));
  WriteLn(s);
  s := sl.Values['222'];
  WriteLn(Length(s));
  WriteLn(s);
  sl.Free;   
Und nur falls es dich überraschen sollte: es können auch mehrere Indices genutzt werden. Zum Beispiel hat das TCustomStringGrid die Eigenschaft Cells:
Dies ist mir bekannt, das es mehrdimensional auch möglich ist.
Aber eben nur mit Integer-Index.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: String in Array-Index

Beitrag von theo »

Mathias hat geschrieben:
Mo 15. Jan 2024, 17:55
Nein, habe ich nicht, daher habe ich gerade folgendes probiert, aber es kommt nur ein Leeestring raus.
Vielleicht mal die Doku lesen, welche dir PascalDragon verlinkt hat?

Code: Alles auswählen

  var
  sl: TStringList;
  s: string;
begin
  sl := TStringList.Create;
  sl.NameValueSeparator:='=';
  sl.Add('a=111');
  sl.Add('b=222');
  sl.Add('c=333');
  sl.Add('d=123456');
  s := sl.Values['c'];
  writeln(s);
  sl.Free;
end;   

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: String in Array-Index

Beitrag von Mathias »

Vielleicht mal die Doku lesen, welche dir PascalDragon verlinkt hat?
Dies habe ich gelesen, aber anscheinend nicht verstanden.

Aber ich sehe trotzdem nicht für was man dies gebrauchen könnte.
Hast du ein Beispiel ?
Einzig in einer List- oder ComboBox.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: String in Array-Index

Beitrag von theo »

Mathias hat geschrieben:
Di 16. Jan 2024, 14:02
Hast du ein Beispiel ?
Einzig in einer List- oder ComboBox.
Das ist eigentlich offensichtlich. Name-Wert Paare sind ja fundamental.

Du hast z.B. eine Datei "test.txt" mit folgenden Name-Wert Paaren:

Code: Alles auswählen

margin: 25px;
background-color: rgb(240,240,240);
font-family: arial, sans-serif;
font-size: 14px;
Mit TStrings.Values kannst du fast "gratis" einen Wert auslesen.

Code: Alles auswählen

var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.NameValueSeparator := ':';
  sl.LoadFromFile('test.txt');
  Writeln(sl.Values['font-family']);
  sl.Free;
end;       

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: String in Array-Index

Beitrag von PascalDragon »

Mathias hat geschrieben:
Di 16. Jan 2024, 14:02
Aber ich sehe trotzdem nicht für was man dies gebrauchen könnte.
Hast du ein Beispiel ?
Was theo sagte. Der TValueListEditor basiert auch darauf.
Im fcl-web-Framework kannst du mit solchen Eigenschaften auf die Werte der HTTP Header zugreifen.
Und die Typen fgl.TFPGMap<,> und Generics.Collections.TDictionary<,> erlauben dir beliebige Schlüssel (*) und Werte zu verbinden und du kannst dann über eine Eigenschaft, welche den Key-Typ als Typ hat auf den Wert zugreifen.

(*) solange die Schlüssel eindeutig sind und einer Ordnung unterliegen
FPC Compiler Entwickler

Antworten