jakdo programu wczytc plik ascii najlepiej do memo lub richedit (plik ma ponad 4MB) i wykonywac operacje na nim (wklejac i wycinac fragmenty)
TMemo przechowuje maksymalnie 64Kb danych. TRichEdit powinno wczytać bez problemu (tylko z kilkusekundowym opóźnieniem).
TRichEdit.Lines.LoadFromFile
TRichEdit.SelStart; TRichEdit.SelLength; TRichEdit.SelText
+F1
var
f:textfile;
begin
assignfile(f,'sciezka/nazwa_pliku');
readln(f,zmienna); //czyta linijkę z pliku
writeln(f,zmienna); // zapisuje linijkę do pliku
closefile(f);
end;
TMemo przechowuje maksymalnie 64Kb danych. TRichEdit powinno wczytać bez problemu (tylko z kilkusekundowym opóźnieniem).
rich edit wczytuje mi tylko 1 linijke krzaczków nic wiecej.
a co do wklejania to chodzi mi nie o wklejanie na koncu czy na poczatku tylko zastepowianie 1 fragmentu wsrodku pliku drogim o tej samej dlugosci.
no i chodzi niekoniecznie musi to byc plik txt równie dobrze musi to dzialac z kazdym innym typem plików. np. exe
rich edit wczytuje mi tylko 1 linijke krzaczków nic wiecej.
Na pewno próbujesz wczytać plik 'binarny'.
a co do wklejania to chodzi mi nie o wklejanie na koncu czy na poczatku tylko zastepowianie 1 fragmentu wsrodku pliku drogim o tej samej dlugosci.
Jak już wspomniałem: SelStart + SelLength + SelText.
no i chodzi niekoniecznie musi to byc plik txt równie dobrze musi to dzialac z kazdym innym typem plików. np. exe
Jeśli to nie będzie plik tekstowy, to zrób zrzut 16-stkowy.
a jak ten zrzut 16 zrobic ?? znaczy jak odczytywac te fragmenty pliku do buffora i potem to w calosc jedna polonczyc??
a jak ten zrzut 16 zrobic ?? znaczy jak odczytywac te fragmenty pliku do buffora i potem to w calosc jedna polonczyc??
Otwierasz plik (TFileStream.Create...), wyszukujesz w strumieniu potrzebny fragment, ustawiasz na nim pozycję początkową (TFileStream.Position (or Seek)), odczytujesz (w pętli) żądaną liczbę bajtów, zamieniasz bajty na HEXy (IntToHex(Bajt, 2)). Hexy wstawiasz do TRichEdit-a i masz zrzut 16-stkowy fragmentu pliku.
a moze jakis kodzik ??
w OnClick przycisku wstaw to:
procedure TForm1.Button1Click(Sender: TObject);
var
FOut, FIn: file;
Mem: Pointer;
begin
AssignFile(FOut,Edit1.Text);
AssignFile(FIn,Edit2.Text);
Reset(FOut,FileSize(FIn));
Reset(FIn,FileSize(FIn));
Mem:=AllocMem(FileSize(FIn));
BlockRead(FIn,Mem^,1);
Seek(FOut,StrToInt(Edit3.Text));
BlockWrite(FOut,Mem^,1);
end;
teraz w Edit1 wpisujesz nazwę tego modyfikowanego pliku, w Edit2 nazwę tego który ma być wstawiony do pierwszego, a w Edit3 offset pod którym ma być wstawiony ten drugi plik
dostalem takie cos ale wywala mi błąd I/O 103 wasnie o takie cos mi chodzi.tylko co zrobic zeby to dzialalo ( D5 ent)
Wygląda na to, że piszesz jakiegoś patche-a. Czyż nie?
Poniżej masz procedurę wstawiającą jeden plik do drugiego w określonej pozycji:
File1 - nazwa pliku, do którego będzie wstawiony plik FileToInsert;
FileToInsert - nazwa pliku wstawianego;
Position - offset w pliku File1, gdzie ma się rozpocząć wstawianie pliku FileToInsert;
Uwaga: Bajty w pliku File1 od pozycji Position do Position+fsInserted.Size są nadpisywane zawartością pliku FileToInsert, czyli inaczej mówiąc - klasyczny PATCH.
procedure InsertFileToFile(const File1, FileToInsert: string; Position: integer);
var
fs, fsInserted: TFileStream;
buffer: array[0..11] of byte;
x: integer;
begin
fs := TFileStream.Create(File1, fmOpenReadWrite);
fsInserted := TFileStream.Create(FileToInsert, fmOpenRead);
try
fs.Position := Position;
repeat
x := fsInserted.Read(buffer, SizeOf(buffer));
fs.Write(buffer, x);
until x < SizeOf(buffer);
finally
fs.Free;
fsInserted.Free;
end;
end;