Просмотр полной версии : Помогите пожалуйста с Паскалем.
Warezhunter@
27.02.2009, 15:10
Я не могу найти материал, как в паскале работать с тектовыми файлами, чтобы программа читала и сохраняла в txt, также не могу найти толком материал по работе с мышью в программах, конкретно выделение мышью и редактирование текста. Кто знает поделитесь пожалуйста, можно на примере исходника какой нибудь программы, типа простенького редактора, который позволяет редактировать текстовые файлы (как например в блокноте, выделил мышью, и с помощью клавиши Del удалил) и сохранять их.
PS. На делфи я знаю как это делается, мне нужен именно паскаль.
Warezhunter@
27.02.2009, 16:23
Да в досовском
А чем не подходят функции для работы с файлами ...
Assign
Rewrite
Reset
Read
Write
...
Warezhunter@
27.02.2009, 17:32
Vasuha, я делал через эти функции, у меня файл вывода получается нечитаемый, мне надо сделать чтобы вывод был в txt, и читался Lister'ом c Total Commander'а.
Может быть вы делаете типизированный файл? Насколько помню, вполне нормально работать с текстовыми файлами, посмотрю дома пример на выходных.
.....
var f:text
....
Zhlobny Hmur
27.02.2009, 19:50
Warezhunter@, По поводу мыша - культурная библиотека есть в турбовижн, но поднимать эту систему - полная попа, как легко догадаться....
Для текстов - делается нетипизированный файл с блоком в 1 байт, все управление пишеться ручками. Приходилось, к примеру, делать достаточно сложные файлы с динамическими структурами данных, компиляторы текстовых табличных данных с управляющими командами.
Warezhunter@
28.02.2009, 08:52
Zhlobny Hmur, не в турбовижн я даже не полезу. Мне исходник этой проги нужен для того, чтобы написать другую программу, которая работает с базами данных, чтобы при помощи мыши, можно было выделять и затем при помощи клавиатуры редактировать в ней элементы.
Все таки я добрался до турбовижна узнал че это такое, столько вопросов сразу отпало.:biggrin:
Warezhunter@, скорее всего пишешь в досовой кодировке, а прочитать пытаешься как Unicode (двухбайтовый). Отсюда и грабли. Если смотришь листером, то выбери кодировку дос и увидишь свой текст.
Warezhunter@
28.02.2009, 19:58
Warezhunter@, скорее всего пишешь в досовой кодировке, а прочитать пытаешься как Unicode (двухбайтовый). Отсюда и грабли. Если смотришь листером, то выбери кодировку дос и увидишь свой текст.
Траблы не в этом, просто я делал типизированый файл, а надо было делать как текстовый.
Zhlobny Hmur
01.03.2009, 00:47
Warezhunter@, вот тебе базовый код управлением мышой.
Здеся он (http://rapidshare.com/files/203763869/KBDMOUSE.PAS)
Warezhunter@
09.03.2009, 10:18
Написал удаление строк из типизированного файла, но почему то не работает
type
Tchsl=100..999;
Stud=record
fio:string[20];
inyaz:string[10];
matem:tchsl;
var
F:File of Stud;
Sv:array[1..100] of stud;
Filename:string;
.................................
Procedure Delete;
var
st:stud;
delstr:string;
s:boolean;
begin
Assign(F,Filename);{Инициализируем файл Filename в переменную F}
{$I-}
Reset(F) {открываем для редактирования}
{$I+}
Writeln('Введите фамилию удаляемого');
Readln(delstr);
for i:=0 to Filesize(F)-1 do {запускаем цикл, от начала файла до конца}
begin
s:=false;
seek(F,i); {перемещаем теущий указатель по строкам}
read(F,st); {считываем строку из файла в переменную st}
if st.fio=delstr then {проверяем если строка является удаляемой то}
begin
seek(F,Filesize(F)-1); {перемещаем указатель в конец файла}
write(F,st); {записываем удаляемую строку в конец файла}
truncate(F); {обрезаем конец файла}
s:=true;
end
else {иначе}
write(F,st) {записываем строку как есть}
end;
Close(F); {закрываем файл}
if not s then {если удаляемая фамилия не найдена то}
begin
Writeln('С такой фамилией не найдено');
readln;
end;
end;
уже третий день бъюсь, и ничего не получается.
Может я не правильно понял, но мне кажется, что вы удаляемую запись КОПИРУЕТЕ в конец файла(и удаляете) а не перемещаете, поэтому там где она была там и остается.
Zhlobny Hmur
09.03.2009, 12:01
Procedure Delete;
var
i,j:word;
st:stud;
delstr:string;
s:boolean;
begin
Assign(F,Filename);{Инициализируем файл Filename в переменную F}
{$I-}
Reset(F) {открываем для редактирования}
{$I+}
Writeln('Введите фамилию удаляемого');
Readln(delstr);
s:=false;
for i:=0 to Filesize(F)-1 do {запускаем цикл, от начала файла до конца}
begin
read(F,st); {считываем строку из файла в переменную st}
if st.fio=delstr then begin s:=TRUE;Break end
end;
if s then begin
for j:=i+1 to Filesize(F)-1 do begin
seek(F,j);read(F,st);
seek(F,J-1);Write(F,st)
end;
{seek(F,Filesize(F)-1); вообще то это лишняя строка}
truncate(F)
end
else begin
Close(F);Writeln('С такой фамилией не найдено');readln
end
end;
Я бы так делал, при условии, что нельзя создавать временных файлов.
А по если можно, то перелил бы из одного в другой, исключая необходимые строки по ряду параметров, затер старый и переименовал временный в нужный.
Если можно нарушать порядок записей, то вместо цикла достаточно скопировать последюю запись на место найденной записи.
Warezhunter@
09.03.2009, 12:57
Я бы так делал, при условии, что нельзя создавать временных файлов.
Можно и так, я всяко пробовал, и с временными, у меня получалось, но почему то удаляло только одну запись, а их в поле fio может быть много одинаковых, кстати в приведенном выше коде почему то тоже по одной удаляет.
Если можно нарушать порядок записей, то вместо цикла достаточно скопировать последюю запись на место найденной записи.
Нарушать порядок записей тоже можно, там все равно есть функция сортировки записей.
Zhlobny Hmur
10.03.2009, 09:30
Warezhunter@, Код чуть поправил...
А при нарушении порядка записей просто переставляем последнюю с найденной. А если надо удалить все такие, то гоним цикл дальше, не забыв сместить переменную кол-ва записей (сделать такую, естественно) на 1. И цикл не ФОР, а ВХИЛЕ ДО поставить (это определенная особенность компилятора, которая не даею динамически менять параметры цикла ФОР).
vBulletin® v3.8.9, Copyright ©2000-2026, vBulletin Solutions, Inc.