Eksportowanie danych z komponentów do pliku tekstowego

0

Witam,
Potrzebuję Waszej pomocy😊 Właśnie zacząłem swoją przygodę z projektowaniem.I w zasadzie wszystko szło mi dobrze do pewnego momentu. A mianowicie chciałbym zapisać to co uzupełniłem do pliku tekstowego(txt). Przeglądałem różne kursy jak i strony internetowe i nic nie znalazłem. Niestety moje próby kończą się nieudolnie, dlatego proszę Was o pomoc, jak mógłbym rozwiązać mój problem.Chciałbym by to wyglądało w sposób jaki przedstawiony jest poniżej.

Przedmiot	Data		Rodzaj zaliczenia
Biologia	25.10.2017	Egzamin

Wykorzystałem: ComboBox i DateTimePicker

obraz poglądowy.PNG

Pozdrawiam,

0

Wybierz sobie jakiś format tekstowej konfiguracji (np. CSV, XML itp.) i zapoznaj się z klasami do jego obsługi z poziomu kodu. Nie wiem czy Twój problem to dobranie odpowiedniego formatu i interfejsu do zaprogramowania eksportu, czy napisanie kodu odczytującego dane z komponentów, więc jeśli możesz to opisz swój problem dokładniej.

I też przydałoby się wiedzieć, czy zawartość formularza zawsze będzie wyglądać tak jak na zrzucie, czy może będzie możliwość dodawania kolejnych wierszy podczas działania programu. To też jest ważne, jeśli chodzi o zaprogramowanie eksportu.

PS: Jeśli o samo projektowanie interfejsu chodzi, to przerwy pomiędzy kolumnami kontrolek nie wyglądają dobrze. Sugeruję podosuwanie ich do siebie:

controls.png

0

Witam,
Dziękuje za odpowiedź. U mnie problem leży w napisaniu kodu odczytującego dane z komponentów, aczkolwiek rady które zostały mi udzielone odnośnie formatu tekstowej konfiguracji zawsze mogą się przydać :)

0

Odpowiedz na drugi paragraf z mojego poprzedniego posta, a coś się wymyśli.

0

Zgodnie z zaleceniami zmniejszyłem odstęp pomiędzy obiektami. Zwiększyłem liczbę obiektów z 3 do 9 [rzędów]. Myślę że dodawanie kolejnych wierszy będzie zbędne.

0

Nie da się w jeden uniwersalny sposób zapisać do pliku stanu/własności wszystkich komponentów wizualnych formy.
I tym samym każda implementacja takiej funkcjonalności formy będzie indywidualna i zależna od tego jakie komponenty są na formie.

2

Jeśli liczba rzędów tych kontrolek nie będzie modyfikowana podczas działania programu (użytkownik nie będzie mógł dodawać rzędów i ich usuwać) oraz wszystkie te komponenty mają coś ze sobą wspólnego (np. klasę bazową) to możesz zapis tych danych oprzeć na metodzie FindChildControl. Jednak żeby miało to prawo działać, kontrolki muszą być sensownie nazwane, np. tak, aby różniły się jedynie indeksem.

W ten sposób kodu wyjdzie mało i będzie uniwersalny - jeśli dodasz lub usuniesz rząd, wystarczy zmienić indeksowanie pętli i kod się dostosuje. Choć można taką pętlę napisać w taki sposób, aby sama obliczała liczbę rzędów i wtedy nic nie trzeba będzie poprawiać.

grzegorz_so:

Nie da się w jeden uniwersalny sposób zapisać do pliku stanu/własności wszystkich komponentów wizualnych formy.

Da się - pętla po komponentach i TStream.WriteComponent :P

0

Witam,
Dziękuje za odpowiedź furious programming. Udało mi się rozwiązać problem nieco innym sposobem. Przerzuciłem wszystkie wartości do etykiet, a następnie z etykiet do notatnika ,gdzie po kliknięciu przycisku generowało mi określone,wybrane wartości. Choć kod nie wygląda profesjonalnie, to coś udało się wymyślić. Następnym krokiem, jak tylko zajrzę do biblioteki(mam dość podstawową wiedzę), będę próbował walczyć z wyżej podanym przez Ciebie sposobem:) Z pewnością wykorzystam podane przez Ciebie rady.
Pozdrawiam

1

@foxars: to co proponuję, dotyczy absolutnych podstaw języka i biblioteki komponentów, więc nie ma się czego bać. Poza tym kodu trzeba napisać tylko kilka linijek :]

procedure TMainForm.SaveCombosToFile(const AFileName: String; AParent: TWinControl);
var
  LFile: TextFile;
  LText: String;
  LControlIdx: Integer;
begin
  AssignFile(LFile, AFileName);
  ReWrite(LFile);
  try
    for LControlIdx := 0 to AParent.ControlCount - 1 do
      if AParent.Controls[LControlIdx] is TCustomComboBox then
      begin
        LText := TCustomComboBox(AParent.Controls[LControlIdx]).Text;
        WriteLn(LFile, LText);
      end;
  finally
    CloseFile(LFile);
  end;
end;

procedure TMainForm.LoadCombosFromFile(const AFileName: String; AParent: TWinControl);
var
  LFile: TextFile;
  LText: String;
  LControlIdx: Integer;
begin
  AssignFile(LFile, AFileName);
  Reset(LFile);
  try
    for LControlIdx := 0 to AParent.ControlCount - 1 do
      if AParent.Controls[LControlIdx] is TCustomComboBox then
      begin
        ReadLn(LFile, LText);
        TCustomComboBox(AParent.Controls[LControlIdx]).Text := LText;
      end;
  finally
    CloseFile(LFile);
  end;
end;

Te dwie metody wystarczą, aby zapisać zawartość wszystkich komponentów dziedziczących po klasie TCustomComboBox do pliku tekstowego, a także by móc odczytać dane z pliku i wrzucić je do kontrolek. W drugim parametrze należy podać okno-rodzica, grupujące te kontrolki - tym rodzicem może być obiekt formularza, ale też np. TPanel czy TGroupBox.

Metody te pomijają wszystkie kontrolki, które ComboBoxami nie są, więc w oknie rodzica mogą się znajdować też inne kontrolki, takie jak przyciski czy etykiety.

0

@furious programming:
To wcale nie muszą być metody. Zwykłe procedury będą bardziej elastyczne i uniwersalne w użyciu

0

@furious programming Dzięki :) Widzę że znacie się na rzeczy:D
Fakt to nie wygląda na trudne, myślałem że to jest sporo trudniejsze. Czas poszukiwać na forum kolejnych inspiracji i w wolnym czasie próbować tworzyć kolejne programy.
Pozdrawiam

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