Tablica Comboboxów - zamiana etykiet komponentów na liczby i ich zapis do pliku tekstowego

0

Witam,

jestem w trakcie pisania programu, w którym użytkownik wybiera w kilkudziesięciu Comboboxach różne wartości, które następnie są one zapisywane w pliku tekstowym, z tym, że w innej postaci. Przykładowo: Użytkownik wybiera a, b lub c, a w pliku ma się zapisać 1,2 lub 3.

Moim zamiarem było wpakowanie wszystkich Comboboxów do tablicy, a następnie użycie fora oraz case'a do zmiany wartości. Pojawił się jednak problem z typami zmiennych- jeżeli deklaruję tablicę Comboboxów to nie mogę nimi operować jak stringami. Nie mogę zbytnio znaleźć sposobu konwersji, a poza tym wydawało mi się, że skoro itemy w comboboxach są stringami to będzie ok.

Czy ktoś coś podpowie?

pozdrawiam

0

Po pierwsze możesz bez problemu mieć tablicę Combobox'ów, jeżeli nie działa to pokaż co nabroiłeś.
Po drugie, zamień to na VirtualStringTree w którym taki wybór będzie o wiele łatwiejszy (każdy element d-go poziomu to radiobox).

0

Wiem, że bez problemu mogę mieć, ale jak na nich operować?

Deklaruję np:

tablica[1]:= Combobox1;
tablica[2]:= Combobox2 ;
tablica[3]:= Combobox3;

a potem chcę:

for i:=1 to 3 do begin
    case tablica[i]='a'
    Write(TF,  1);
    case tablica[i]='b'
    Write(TF, 2);
    case tablica[i]='c'
    Write(TF, 3);
  end;

gdzie oczywiście TF jest plikiem, a i licznikiem..

dodanie znaczników <code class="delphi"> - fp

1

Do kursu podstaw marsz i poczytać jak odwołujemy się do własności komponentów. Jakim cudem do jak rozumiem zmiennej tablica, będącej pewnie typu array[X..Y] of TComboBox możesz się odwoływać jak do zmiennej typu string. Czy własnośc Items stała się nagle własnością default? Bo nic o tym osobiście nie wiem. Jeżeli koniecznie tak się chcesz odwoływać to musiał być zrobić sobie kontrolkę własną dziedziczącą po TComboBox i tam dać własnośc Items jako właśnie default. A i tak musiał byś się odwoływać wtedy raczej w stylu Tablica[IndeksTablicy][IndeksItems] := 'nie ogarniam podstaw, a nie chce się mi googlować, bo tak';. I do 1000 nieogarnietych, niekorzystających z Google. Dlaczego znowu temat z banalnymi podstawami ląduje tutaj? Przenoszę, ale póki mamy dział Newbie to tam się pisze o takim czymś.

EDIT: aż sprawdziłem i kod...

var
  a : array[0..0] of TComboBox;
begin
  a[0] := TComboBox.Create(Self);
  a[0][0] := '"Asz rence opadajom" :/';
end;

Powoduje błędy:

[Error] Unit1.pas(31): Class does not have a default property
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Czyli jednak programiści nie zmodyfikowali automagicznie przynajmniej Delphi 7 i property Items nie stało się nagle, równie automagicznie default. Czyli musisz zrobić tak jak napisałem. Albo tworzenie własnej kontrolki albo odwołyanie się po prostu do odpowiedniej własności. Chyba, że jednak nowsze Delphi. Bo pod Lazarusem 64 bitowym mam również:
unit1.pas(37,7) Error: No default property available
Dla takiego samego kodu, jak powyżej.

1

Tak jak napisał poprzednik, przejrzyj przynajmniej pobieżnie podstawy.

var tablica[1..3]of TCombobox;
tablica[1]:=Combobox1;
tablica[2]:=Combobox2 ;
tablica[3]:=Combobox3;   

if tablica[i].text='a' then ...
0

Ano fakt. Bo ja założyłem, że skoro program ma wybierać jakieś własności z dostępnych, to pytający chce operować na Items. Ale oczywiście Text jest inną własnością. Ją rownież, jeżeli czujesz taką pottzebę, mozęsz we własnej kontrolce, dziedziczącej po oryginalnej - uczynić domyślną. Ale najprościej będzie chyba stosować się do normalnych zasad języka. Nie wymyslając samodzielnie i niepotrzebnie - jakichś "herezji" ;)

0

@Gini - ten kod:

for i:=1 to 3 do begin
    case tablica[i]='a'
    Write(TF,  1);
    case tablica[i]='b'
    Write(TF, 2);
    case tablica[i]='c'
    Write(TF, 3);
  end; 

równie dobrze można zamienić na taki:

for I := 1 to 3 do
  Write(TF, Ord(Tablica[I]) - 96);

pod warunkiem, że Tablica[I] to Char, dla **String**ów trzeba dodać odwołanie do pierwszego znaku, czyli:

for I :+ 1 to 3 do
  Write(TF, Ord(Tablica[I][1]) - 96);
0

@_13th_Dragon

zastosowanie takiego rozwiązania generuje błąd SGSEGV w kontrolce GetText.

0

Bo pewnie nie sprawdziłeś czy i jest w zakresie 1..3

0

Faktycznie :) wielkie dzięki za pomoc i cierpliwość.

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