Moduł ten umożliwia zmianę ikony pliku exe, działa na wszystkich prawie execach 😉 krzaczy się tylko na specjalnie modyfikowanych plikach etc. Ikonke zmieniamy funkcją UpdateApplicationIcon, pierwszy parametr to sciezka do ikony, a drugi do pliku .exe Mam nadzieje, że komuś się to przyda.

Zaznaczam ze kod nie jest mojego autorstwa.

Autor: Filuu

Poniższy artykuł przedstawia w jaki sposób wyszukiwać pliki na dysku według podanej maski, czasu utworzenia czy rozmiaru

Wyszukiwanie plików w Delphi opiera się o rekord TSearchRec. Jego budowa przedstawia się następująco:

Tłumaczenie parametrów :

Time – data utworzenia
Size – rozmiar pliku
Attr – atrybuty pliku :
faReadOnly – Tylko do odczytu
faHidden – Ukryty
faSysVolume – Systemowy
faArchive – Zarchiwizowany
faAnyFile – Zwykły plik
faDirectory – Katalog
faVolumeID – Etykieta

FindHandle – znaleziony uchwyt
FindData – zawiera informacje o pliku:
dwFileAttributes – Atrybuty pliku
ftCreateionTime – Data utworzenia
ftLastWriteTime – Data ostatniej modyfikacji
ftLastAccessTime – Data ostatniego korzystania z pliku

Do wyszukania pliku posłużymy się poleceniem FindFirst np.

Pierwsza zmienna polecenia FindFirst określa ścieżkę i maskę pliku, druga określa atrybut pliku, a trzecia nasz Rekord, nazwałem go Info. Zmienna znaleziono informuje nas o liczbie plików o podanych przez nas parametrach znalezionych na dysku. Polecenie FindNext umożliwia dalsze przeszukiwanie pliku. Aby ograniczyć wyniki wyszukiwania do plików np. o określonym rozmiarze musimy dodać warunek :

Autor: Nakiel

Oki doki, dzisiaj postaram się pokazać jak w prosty sposób zrobić plik podobny do archiwum np. zipa czy rara. Wprawdzie w naszym formacie nie będziemy stosowali kompresji (aby niepotrzebnie na początek nie komplikować) ale pokaże jedno z możliwych podejść do tego zagadnienia. Na początek może napisze po krótce do czego może się przydać taki plik, otóż można w nim trzymać np. spakowane levele do gry, save gamy, mapy oraz inne zasoby do programów. Ok, koniec marudzenia, co będziemy potrzebowali do szczęścia ?
1. Podstawy programowania obiektowego.
2. Podstawy wiadomości o strumieniach.
3. kilka minut czasu aby przeczytać i zrozumieć.
Na początek, trzeba się zastanowić jaka będzie wewnętrzna struktura naszego archiwum ? Ja wybrałem bardzo prosty układ, pliki w archiwum są przechowywane kolejno w następującej postaci:
Rozmiar nazwy[int], nazwa[tablica bajtów], rozmiar danych[int], dane plik[tablica bajtów]
Jakie są główne plusy:
1. Prosta budowa pliku.
2. Łatwość dodawania kolejnych danych
minusy:
1. Czasochłonne usuwanie plików z archiwum.
2. Czasochłonna zmiana kolejności plików w archiwum.
3. Aby uzyskać listę plików trzeba przeskanować całe archiwum.

Jak widać jest więcej minusów jak plusów, ale w moim przypadku przeważyła dla mnie prostota pliku, poza tym kasowanie/reorganizacja archiwum nie są zbyt częstymi operacjami więc nie były dla mnie dużym minusem.
Ok. wiemy już, co chcemy oraz jakimi środkami to uzyskamy, teraz wypisze metody, które zaimplementowałem w naszej klasie obsługującej archiwum, i opisze z grubsza (szczegóły można zrozumieć analizując dołączony kod) idee działania tych metod:

Tworzymy nasze archiwum, w zależności od trybu mode (patrz TFileStream + F1), tworzymy nowe archiwum lub otwieramy już istniejące. Inicjujemy wewnętrznego streama który będzie obsługiwał nasz plik.

Bez komentarza 😉

Głównym zadaniem tej procedury jest przeskanowanie archiwum i odnalezienie nazw oraz rozmiarów plików przechowywanych w archiwum. Ponieważ układ w naszym arch. jest sekwencyjny wystarczy abyśmy pobrali nazwę i rozmiar pliku na początku którego obecnie znajduje się nasz wewnętrzny stream, zapisujemy te dane, a następnie przeskakujemy o wielkość właśnie zbadanego pliku i trafiamy na początek następnego. Czynność tą powtarzamy aż dojdziemy do końca.

Dzięki tej procce dodajemy nowe dane do naszego archiwum, jak widać dane mogą być pobierane z dowolnego streama (lub pliku), który zwróci nam swój rozmiar. Metoda na początku przeskakuje na koniec naszego archiwum, a później dopisuje do niego przekazane dane. Zanim jednak to zrobi sprawdza czy w naszym archiwum nie ma już pliku o podanej nazwie. W tej implementacji możliwe jest przekazanie całej ścieżki jako nazwy pliku. Nazwa jest Case sensitive !

Ponieważ jak wiemy usuwanie pliku jest czasochłonne ta metoda ma dodatkowy parametr imediate, który mówi czy usunięcie ma zostać wykonane zaraz po wywołaniu tej metody. Po co takie coś ? Ano jeśli ustawimy imediate na false, każde wywołanie tej procedury zapisze tylko nazwę pliku, który ma zostać usunięty. Na sam koniec, gdy już wybierzemy wszystkie pliki do skasowania wywołujemy ExecutePendingDeletion i całe kasowanie następuje dużo szybciej (w jednym przebiegu).

Funkcja dokonuje właściwego kasowania z archiwum (polecam przyjrzeć się metodzie DeleteFile od środka). Idea jest bardzo prosta:
1. Tworzymy tymczasowy stream, do którego będziemy kopiowali dane.
2. Ustawiamy się na początku naszego archiwum
3. Pobieramy nazwę pliku z archiwum, jeśli ta nazwa jest na liście plików do skasowania przeskakujemy do punktu 5
4. Kopiujemy plik (nazwa + dane) do tymczasowego streama
5. Przechodzimy do kolejnego pliku w naszym archiwum, i wykonujemy punkt 3. Całość powtarzamy tak długo aż skończą się dane w archiwum.
6. Zamykamy tymczasowy stream, zamykamy nasze archiwum.
7. Kasujemy nasze archiwum, dokonujemy rename tymczasowego staremu (pliku) do nazwy jaką miało nasze stare archiwum i ponownie je otwieramy

Funkcja zapamiętuje aktualna pozycje w streamie, następnie pobiera nagłówek pliku na początku którego ustawiony jest stream po czym powraca do pozycji zapamiętanej na początku. Jako rezultat zwraca pobraną nazwę pliku.

Funkcja pobiera rozmiar pliku, na początku którego ustawiony jest stream po czym przeskakuje o tą wartość dalej, w rezultacie trafia na początek kolejnego pliku.

Funkcja zwraca pointer do streama z którego można pobrać plik na początku którego znajduje się stream. Jeśli skipHeader jest ustawiony na true, zwrócony stream będzie pokazywał na początek danych pliku. Jeśli zaś skipHeader = false stream będzie pokazywał na nagłówek pliku. W zmiennej FileSize zostanie zwrócona wielkość pliku. UWAGA: przeczytanie mniejszej lub większej ilości danych ze zwróconego streama niż FileSize powoduje, że nasze wewnętrzny stream jest gdzieś poza nagłówkami plików. Aby móc ponownie z niego korzystać należy wywołać procedure FindFileNamed, procedury które mają w nazwie NextFile nie będą poprawnie działać !

Działanie jest identyczne jak w GetNextFile, jedyna różnica polega na tym, że zwrócony stream będzie ustawiony na początku pliku o zadanej nazwie.

Zasada działania identyczna jak w GetNextFileName, jedyna różnica polega na tym, że zwracane są inne dane z nagłówka.

Funkcja zwraca true jeśli nie jesteśmy na końcu archiwum. Aby to sprawdzić wystarczy porównać czy pozycja w naszym wewnętrznym streamie jest mniejsza od wielkości pliku.

Procedura zmienia kolejność plików w archiwum. Zasada jest zbliżona do kasowania pliku, czyli tworzymy tymczasowy stream, do którego kopiowane są kolejno dane z naszego archiwum. Różnica polega na tym, że kolejne dane które będą skopiowane są wyszukiwane metodą FindFileNamed na podstawie zmiennej OrderedNames.

Ok. To tyle, trochę zwięźle i może lakonicznie, ale kod jest naprawdę prosty, proponuje poeksperymentować i zobaczyć jak to wygląda w praktyce. Wszelakie pytania mile widziane.

Autor: Toster

Do pobrania pełnej ścieżki dostępu służy funkcja ParamStr(0)
jednak czasem zachodzi potrzeba „rozbicia” jej ma poszczególne elementy
służą do tego następujące funkcje konwertujące:

* ExtractFileDir – pytanie o pełną ścieżkę katalogu bez nazwy pliku,
* ExtractFileDrive – pytanie o napęd dyskowy,
* ExtractFileExt – pytanie o rozszerzenie pliku,
* ExtractFileName – pytanie o nazwę pliku(z rozszerzeniem),
* ExtractFilePath – pytanie o pełną ścieżkę katalogu bez nazwy pliku,

ExtractFileDir od ExtractFilePath różni się tym że w tym pierwszym nie ma ukośnika na końcu
(np.: ExtractFileDir poda
„E:\gra2”
a ExtractFilePath poda
„E:\gra2\”

Autor: Sazian

Zapis i odczyt danych z pliku przy pomocy poleceń ObjectPascal

Zapis danych do pliku : 

AssignFile – przypisanie zmiennej pliku
Rewrite – otwarcie pliku, jeśli plik nie istnieje to zostanie utworzony. Jeśli natomiast istnieje to jego dawna zawartość zostanie utracona.
Reset – otwiera plik, plik musi istnieć na dysku. Podczas otwarcia zawartość pliku nie jest tracona
Append – otwiera plik tekstowy do dalszego dopisywania. Wskaźnik ustawiony jest na końcu pliku
Write – zapis tekstu
WriteLn – zapis tekstu w nowej linii
CloseFile – zamknięcie pliku
TextFile – jeden z formatów pliku. Można również tworzyć pliki w innych formatach np. file of Char, File of Byte, File of Rect (dowolny rekord),..

Oto przykład :

 

Odczyt danych z pliku : 

Podobnie jak przy zapisie korzystamy z funkcji „pascalowych”. W skrócie :

FileExist – sprawdza czy plik o podanej nazwie istnieje
ReadLn – odczytuje linię tekstu z pliku, zapisuje ją w zmiennej String oraz przenosi wskaźnik do następnej lini.

Autor: Nakiel

Pliki INI to nic innego jak pliki zawierające konfigurację jakiegoś programu. Coraz częściej te pliki zastępuje się korzystaniem z rejestru, co jest bardziej wygodne.

1.Przykładowa struktura naszego pliku (np. setup.ini): 

Umieściliśmy w naszym pliku informacje o tytule programu, jego pozycji, szerokości, wysokości oraz ścieżki do trzech ostatnio otwieranych plików.

2.Tworzenie i zapis do plików 

Na początku do deklaracji uses musimy dodać IniFiles, następnie plik konfiguracyjny tworzymy za pomocą polecenia Create np :

Zmienna ParamStr(0) zawiera ścieżka wraz z nazwą naszego programu. Poprzez polecenie ExtractFilePath wyciągniemy nazwę katalogu w którym znajduje się program. Dzięki temu plik setup.ini zostanie utworzony w tym katalogu gdzie znajduje się program.
Tworzenie nowych elementów:
Tekst :

Liczba całkowita :

Włączony / Wyłączony :

Data :

Data i godzina :

Godzina :

Liczba rzeczywista :

Wartość binarna :

Jeśli zapiszemy w/w polecenie (String) powinniśmy otrzymać :

3.Odczyt zmiennych z pliku 

Do odczytu wartości używamy tych samych poleceń co do zapisy. Zastępujemy jedynie słowo Write(zapisz) słowem Read(odczytaj). Oto przykład odczytu wartości :

4.Usuwanie zmiennych z pliku

Aby usunąć całą grupę np. Ustawienia musimy użyć polecenia

zaś, jeśli chcemy usunąć tylko daną zmienną posłużymy się

Przydatne może się okazać polecenie, które sprawdza czy dana grupa istnieje

5.Odczyt całych grup oraz ich wartości 

Mamy możliwość zapisania np. do listy TListBox nazw wszystkich grup, zmiennych danej grupy, wartości zmiennych danej grupy. W tym celu posłużymy się poleceniami: Odczyt nazw grup :

Odczyt nazw zmiennych danej grupy :

Odczyt wartości zmiennych danej grupy :

W ten sposób dotarliśmy do końca tej lekcji.

 

Autor: Nakiel

Posłuż się tym kodem:

Autor: Toster

Należy skorzystać z funkcji ExtractFilePath, która zwraca ściężkę do podanego w parametrze pliku. Jako argument wysyłamy nazwę exeka, którą odczytujemy z Application.ExeName:

Autor: Iskar

Większość edytorów tekstowych posiada możliwość otwarcia pliku klikając na jego ikonę podczas przeglądania zawartości dysku. Aby również nasz program to potrafił wystarczy dodać krótki kod:

W OnShow Formy wpisz :

Autor: Nakiel

Na początku utworzymy odpowiednią funkcję, która będzie zwracać obiekt klasy TDateTime, a nastepnie przy pomocy FormatDateTime wyświetlimy datę na ekranie. Oto kod:

Autor: Nakiel

Aby pobrać informacje na temat wykonawcy, tytułu, albumu, roku wydania oraz gatunku utworu z pliku MP3 to musimy odczytać jego ostatnie sektory. Ze względu na rozbudowaną strukturę tagów proponuję utworzyć osobny plik, w którym będzie znajdować się funkcją pobierająca dane …

Oto jego kod źródłowy :

Autor: Nakiel