Z Delfinka na FreePascal

0

Jak ten kod przerobić z Delphi do FreePascala?

unit RR_;

interface

uses
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Shapes, StdCtrls, slowniezl, Menus, ImgList;

type
TForm1 = class(TForm)

private
{ Private declarations }

public
{ Public declarations }
procedure ReadData(NumberOfRec: Byte);
procedure WriteDate;
procedure RefreshRec;
end;

TDaneDostawcow = packed record
Nazwa: string[50];
Adres: string[50];
NIP: string[13];
Seria: string[2];
NrSerii: string[7];
WydanyDnia: string[10];
Przez: string[100];

end;

TFileDaneDostawcow = file of TDaneDostawcow; // wskazanie na rekord [ nowy typ ]

var
Form1: TForm1;

implementation

uses DodajDane_, O_autorze_;
var
FileName: string;

{$R *.dfm}

procedure TForm1.WriteDate;

var
VFile: TFileDaneDostawcow; // zmienna wskazuje na nowy typ plikow
VRec: TDaneDostawcow; // zmianna wskazuje na rekord
FSize: Integer; // ilosc danych znajdujacych sie w pliku...
begin
AssignFile(VFile, FileName); // skojarz nazwe pliku ze zmienna...
if not FileExists(FileName) then // jezeli plik nie istnieje...
Rewrite(VFile) else //... stworz go, a jezeli istnieje...
Reset(VFile); //... tylko otworz

try
FSize := FileSize(VFile); // pobierz rozmiar ( ilosc danych )
if FSize > 0 then // Czy plik nie jest pusty?
Seek(VFile, FSize); // ustaw na samym koncu pliku

{
Dodaj do rekordu dane wziete z kontrolek tekstowych znajdujacych
sie na formie.
}

{Tu wiem jak przekształcić pobieranie danych zwykłe readln}
with VRec do
begin
Nazwa := Form2.NazwaDodaj.text;
Adres := Form2.AdresDodaj.text;
NIP := Form2.NipDodaj.text;
Seria := UpperCase(Form2.SeriaDodaj.text);
NrSerii := Form2.NrDodaj.text;
WydanyDnia := Form2.WydanyDodaj.text;
Przez := Form2.PrzezDodaj.text;
end;
Write(VFile, VRec); // zapisz rekord do pliku
finally
CloseFile(VFile); // zamknij plik
RefreshRec; // wywolaj procedure ( patrz: linia 140 )
end;
end;

procedure TForm1.ReadData(NumberOfRec: Byte);
var
VFile: TFileDaneDostawcow; // zmienna wskazuje na nowy typ plikow
VRec: TDaneDostawcow; // zmianna wskazuje na rekord

begin
{
Ta procedura odczytuje rekord. Jako parametr tej procedury podawany
jest numer rekordu, ktory ma byc odczytany.
}
try
AssignFile(VFile, FileName);
Reset(VFile);

try
  Seek(VFile, NumberOfRec); // ustaw na danym rekordzie....
  Read(VFile, VRec); // odczytaj rekord

{ Teraz dane znajduja sie w rekordzie i nalezy je przypisac do kontrolek }
with VRec do
begin
LabelNazwa.Caption := Nazwa;
LabelAdres.Caption := 'Adres: ' + Adres;
LabelNip.Caption := 'NIP lub Pesel: ' + Nip;
LabelSeria.Caption := 'Seria: ' + Seria;
LabelNumerSerii.Caption := 'Nr ' + NrSerii;
LabelWydanyDnia.Caption := 'Wydany dnia: ' + WydanyDnia;
LabelWydanyPrzez.Caption := 'przez ' + Przez;
end;
finally
CloseFile(VFile); // zamknij plik
end;
except
on EInOutError do
Application.MessageBox('Nie mogę otworzyć pliku Dostawcy.dat. Sprawdź czy plik istnieje.', 'Brak pliku', 16);
end;
end;

procedure TForm1.RefreshRec;
var
VFile: TFileDaneDostawcow;
VRec: TDaneDostawcow;
I: Integer;
n: string;
begin
{
Ta procedura ma za zadanie odswiezyc liste rekordow znajdujacych
sie w danym pliku. Zawartosc komponentu najpierw zostaje czyszczona,
a pozniej nastepuje odczytanie wszystkich rekordow i dodanie ich do listy.
}
AssignFile(VFile, FileName);
if not FileExists(FileName) then // Jezeli plik nie istnieje - nie rob nic
Exit else

Reset(VFile);

ComboNazwa.Items.Clear; // czysc liste danych w komponencie

{
Ponizsza petla ma za zadanie dodawanie kolejnych pozycji do listy.
"FileSize" zawiera informacje o ilosci rekordow znajdujacych sie
w pliku.
}

for I := 0 to FileSize(VFile) - 1 do begin
Seek(VFile, i); // ustaw na danym rekordzie....
Read(VFile, VRec);
ComboNazwa.Items.Add(VRec.Nazwa);

//ComboNazwa.Items.Add('Rekord nr: ' + IntToStr(i));

end;

CloseFile(VFile);
end;

end.

Z góry dzięki
Wachcio

0

Nie wiem czy coś sie da bo raczej sie nie da tego przerobic w calosci na FreePascal po pierwsze FreePascal jest srodowiskiem Dosowym i nie ma tam komponentow wizualnych.Delphi a FreePascal to trochę odmienne srodowiska programowania.

0

Nie ma mowy, zebyś to przeniósł na FP. Korzystasz z VCL, a tego FP nie posiada. Musisz przepisać to w winapi.

0

Nie ma mowy, zebyś to przeniósł na FP. Korzystasz z VCL, a tego FP nie posiada. Musisz przepisać to w winapi.

Nie chodzi mi o VCL tylko o sam kod. Już trochę ruszyłem z miejsca. W uses wpisuje dos, crt, SysUtils. Ustawiam zgodność z Delphi. Komponenciki wizualne chciałem zastąpić Zwykłym Readln, ale:
Write('Nazwa: ');
Nazwa := Readln(Nazwa);
Daje mi błąd: Error: Incompatible types: got "VOID" expected "ShortString"
Jak go poprawić?

Procedurę RefreshRec dałem na początek abym mógł ją używać w innych procedurach. Jak ją ustawić na 'Public' tak jak w Delfinku?

Wachcio

0

Nazwa := Readln(Nazwa);

Dwa razy to samo? Starczy Readln(Nazwa);

0

Nazwa := Readln(Nazwa);

Dwa razy to samo? Starczy Readln(Nazwa);

Chyba średnio 3 godziny snu dziennie od dłuższego czasu mi nie służą :-D. Dzięki

0

Nie polecam przepisywać tego na WinApi żeby działało pod FPC. Z takiej to przyczyny, że są problemy, a do tego mój projekt w WinApi przeniesiony do FPC z mniej niż 20 KB, które zajmował w D7 w FPC zajmuje więcej niż 1 MB.

0

Bo nie liczyłeś przy 20kb bibliotek ktore trzeba tachać do straszych OS.

0

Jakich bibliotek ? Tesowany był na Win98/Me bez zainstalowanego D7 i działało bez żadnych biblotek i problemów.

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