Jak odczytać wartość stałej znając jej nazwę?

0

Witajcie,
Mam plik który zawiera

unit uConsts;

interface

const
  cLB = #13#10;
  cAPP_NAME = 'AppName';
  cSettings_Dir = 'Settings\';

Jak można się dobrać do wartości podając nazwy jako string? Lub zrobić listę wszystkich wpisów?

0

Oto chodzi?

unit uConsts;

interface

const
  cLB = #13#10;
  cAPP_NAME = 'AppName';
  cSettings_Dir = 'Settings\';

implementation

end.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uConsts, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Showmessage(cLB);
  Showmessage(cAPP_NAME);
  Showmessage(cSettings_Dir);
end;

end.
1

@piars:

To coś by się we współczesnych jezykach nazywało refleksją (rygoryści, spokój, wiem, nieco upraszczam)

Delphi for .NET, ale to chyba nie żyje ??? by mogło to umożliwiać

Zaleznie co jest celem, projekt mozna inaczej poprowadzić
Jakiś automatyczny panel do konfiguracji cehsz zbudować?

https://www.google.com/search?client=firefox-b-d&q=delphi+seriaze+to+json
To trochę pokazuje, że dosc/mocno trudne zagadnienia
Pokazuje też, ze lepiej mieć to zagadnienie ograniczone do klasy, niż zmiennych/stałych lokalnych

0

@Mariusz Bruniewski: no właśnie nie o to, bo tak to wiem chodzi o to

Label1.Caption := GetConstValue('cAPP_NAME');

gdzie GetConstValue wyciągnie wartość cAPP_NAME

0

Skoro sam tworzysz kod to sam możesz dodać w unicie uConsts cechy zmiennej const.

unit uConsts;

interface

const
  Tab  : array[1..4] of String = (('cLB'), ('cAPP_NAME'), ('cSettings_Dir'), ('MoznaZ_EXE'));
  Tab1 : array[1..4] of String = (('#13#10'), ('AppName'), ('Setting\'), ('Co ten wymyślił ?'));

  cLB           = #13#10;
  cAPP_NAME     = 'AppName';
  cSettings_Dir = 'Setting\';
  MoznaZ_EXE    = 'Co ten wymyślił ?';

implementation

end.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uConsts, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
  for i := 1 to 4 do
  ListBox1.items.add(Tab[i]+' = '+Tab1[i]);
end;
0

@Mariusz Bruniewski: jest to jakieś rozwiązanie, a czy nie da się pobrac listy const-ów ?

0

@piars: mam kontrolkę która ma label, label jest generowany na podstawie nazwy pola kontrolki, w pliku gdzie są const-y są wpisy np: VAT_NO='NIP i teraz na podstawie nazwy pola chcę pobrać wartość czyli 'NIP' czyli np: Kontrolka.Label := GetName(Kontrolka.Name)

0
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
  for i := 1 to 4 do
  if pos('AppName', tab1[i]) > 0 then Form1.Label1.Caption := tab[i];
end;
0

@Mariusz Bruniewski: to jednak nie to o co mi chodzi, musi byc tak Tab1 musiałby byc nazwą formy a to string reasumując mając formę generyczną i na podstawie jej nazwy wyciągam dane z pliku zawierającym const-y. Chcę osiągnąć rozwiązanie problemu: forma ma kontrolki z labelkami w parencie formy jest metoda ktora wypelnia opisy kontrolek na podstawie opisu kontrolki

function TfmBase.GetControlCaption(aName: string): string;
var
  i : integer;
begin
  for i := 1 to Length(fmFirmEditT0) do
  begin
    if fmFirmEditT0[i] = aName then
      Result := fmFirmEditT1[i];
  end;
end;

i tu jest problem bo trzeba podać nazwę a nie string (fmFirmEditT0)

1

Jak można się dobrać do wartości podając nazwy jako string? Lub zrobić listę wszystkich wpisów?

domyślam się że chcialbyś mieć co na kształt funkcji

function (aConstName:string):variant;

Nie jestem fachowcem od kompilatorów, może ktoś mądrzejszy mnie sprostuje. Ale wydaje mi się że się nie da, ponieważ już na etapie kompilacji kodu każde wystąpienie w kodzie źródłowym np. cAPP_NAME jest zastępowane literałem 'AppName' i taki kod jest kompilowany, tym samym w kodzie wynikowym nie ma jakiejkolwiek informacji o cAPP_NAME.
Deklaracje const są tylko informacjami dla kompilatora

0

To z pliku exe można wyciągnąć to.
Przechwytywanie.JPG

1

nie bardzo rozumiem - masz stałe w programie (const), do których wartość wczytujesz z pliku?? No to albo to są stałe (i ich wartości są znane na etapie kompilacji) albo to nie są stałe tylko zmienne. A jak są to zmienne to zamiast 34 czy 75 czy ile ich tam masz mieć JEDNĄ - TDictionary<string, string> i tam trzymać wszystkie wartości.

2

Zamiast stałych powinieneś użyć mapy, czyli kolekcji typu klucz-wartość, wartość wyciągniesz po nazwie klucza. Delphi ma chyba jakiś kulawy odpowiednik mapy, jakieś TDictionary czy coś.

Nawet gdyby była obsługa refleksji, to stosowanie jej w takich przypadkach to bezsens.

1

mam plik AppConst.ps tam są zmienne chciałbym odczytać listę tych zmiennych i posługując się ich nazwami pobrać warości — piars dziś, 00:50

@piars: brniesz w złą stronę projektowo. A że nie odpowiadasz na szczegółowe sugestie / pytania, to i nie dam propozycji.
Dopiero na drugiej stronie wątku zaczyna wynikać, "w którą stronę" chcesz dokonać tego czytania

a TDictionary czy jak-mu-tam jest jedną z dobrych propozycji

0

Ok, to może inaczej opiszę co chcę osiągnąć.

  1. Aplikacja powiązana z bazą danych, dużo formatek do przeglądu lub edycji

  2. Formatki edycyjne zawierają pola z bazy (może być ich dużo)

  3. Pola edycyjne są nazywane tak jak pola w bazie, dodatkowo można je nazwać np formName + FieldName co zapewnia unikalność nazewnictwa
    ....
    co chcę osiągnąć?

  4. mechanizm który załaduje nazwy opisujące pola edycyjne (labelki)

  5. wszystko ma być zawarte w pliku exe bez żadnych skryptów lub zewnętrznych plików

0
piars napisał(a):
  1. Pola edycyjne są nazywane tak jak pola w bazie […]

To powinieneś zrobić w oknie OI lub w kodzie, jeśli tworzysz formularze dynamicznie.

[…] dodatkowo można je nazwać np formName + FieldName co zapewnia unikalność nazewnictwa

To że można, nie oznacza, że powinieneś to robić. Dla mnie to bez sensu. Po co tracisz na to czas?

2

Odpowiem Ci z doświadczenia. NIE. Samych constów żadnym RTTI, funkcjami, API czy czymkolwiek innym nie wyszukasz. Musisz kod przerobić zgodnie z tym co pisali przedmówcy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1