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?
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?
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.
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
@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
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;
@Mariusz Bruniewski: jest to jakieś rozwiązanie, a czy nie da się pobrac listy const-ów ?
@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)
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;
@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)
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
To z pliku exe można wyciągnąć to.
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.
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.
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
Ok, to może inaczej opiszę co chcę osiągnąć.
Aplikacja powiązana z bazą danych, dużo formatek do przeglądu lub edycji
Formatki edycyjne zawierają pola z bazy (może być ich dużo)
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ąć?
mechanizm który załaduje nazwy opisujące pola edycyjne (labelki)
wszystko ma być zawarte w pliku exe bez żadnych skryptów lub zewnętrznych plików
piars napisał(a):
- 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?
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.