Урок Delphi 7 |
Уроки Delphi
1. Первая программа
2. Использование компонентов
3. События Delphi
4. Типы данных Delphi
5. Создание своих типов данных
6. Выражения и операторы
7. Работа с файлами в Delphi
8. Дополнительные формы
9. Подпрограммы в Delphi
10. Исключительные ситуации
11. Взаимодействие приложения с пользователем
12. Указатели в Delphi
13. Обзор компонентов
14. Работа со строками
15. Создание интерфейса
16. Графика в Delphi
17. Многопоточность в Delphi
18. Динамическое создание
компонентов Поиск по сайту Это важно:
Метод Application.ProcessMessages;
Это полезно:
Параметр Sender в обработчиках событий;
Бояться не надо |
Технология работы с файлами в системе Delphi требует определённого порядка действий:
var F: File ; Описанная таким образом файловая переменная считается нетипизированной, и позволяет работать с файлами с неизвестной структурой. Данные считываются и записываются побайтно блоками, размер которых указывается при открытии файла, вплоть от 1 байт. Но чаще используются файлы, состоящие из последовательности одинаковых записей. Для описания такого файла к предыдущему описанию добавляется указание типа записи: var F: File of тип_записи ; В качестве типа могут использоваться базовае типы, или создаваться свои. Важно только, чтобы для типа был точно известен фиксированный размер в байтах, поэтому, например, тип String в чистом виде применяться не может, а только в виде String[N], как указывалось в уроке Delphi 5. Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая. Поэтому сначала в программе лично я описываю нужный тип, а затем ввожу две переменные этого типа - файловую и обычную: Для текстовых файлов отдельно укажу, что тип файловой переменной в этом случае TextFile, а тип обычной - String. Для открытия файла нужно указать, где он расположен. Для этого файловая переменная должна быть ассоциирована с нужным файлом, который определяется его адресом. Адрес файла может быть абсолютным, с указанием диска и каталогов ('C:\Мои документы\Мои рисунки\FileName.ini'), или относительным, тогда он создаётся в папке с .exe файлом программы. Для задания относительного адреса достаточно указать имя файла с нужным расширением. Делается это оператором AssignFile : AssignFile(SaveF, 'C:\Мои документы\Мои рисунки\FileName.ini'); AssignFile(SaveF, 'FileName.ini'); Теперь файл должен быть открыт. Открытие файла оператором Rewrite приведёт воссозданию файла заново, т.е. существующий файл будет без предупреждения уничтожен, и на его месте будет создан новый пустой файл заданного типа, готовый к записи данных. Если же файла не было, то он будет создан. Открытие файла оператором Reset откроет существующий файл к считыванию или записи данных, и его указатель будет установлен на начало файла : Rewrite(SaveF); Reset(SaveF); Каждый из этих операторов может иметь второй необязательный параметр, имеющий смысл для нетипизированных файлов, и указывающий длину записи нетипизированного файла в байтах: Rewrite(SaveF, 1); Reset(SaveF, 1); Чтение файла производится оператором Read : Read(SaveF, SaveV); Запись в файл производится оператором Write : Write(SaveF, SaveV); При этом чтение и запись производится с текущей позиции указателя, затем указатель устанавливается на следующую запись. Можно проверить, существует ли нужный файл, оператором FileExists : if FileExists('FileName.ini') then Read(SaveF, SaveV); Принудительно установить указатель на нужную запись можно оператором Seek(SaveF, N), где N - номер нужной записи, который, как и почти всё в программировании, отсчитывается от нуля: Seek(SaveF, 49); - установка указателя на 50-ю запись. При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура End Of File), который равен true, если прочитана последняя запись и указатель находится в конце файла: while (not EOF(SaveF)) do Read(SaveF, SaveV); Для текстовых файлов вместо Read и Write используются операторы Readln и Writeln, умеющие определять конец строки. Оператор Truncate(SaveF) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла. В конце работы с файлом его необходимо закрыть. Это делается оператором CloseFile(SaveF) ; Теперь можно изменить программу из первой части урока, запоминающую своё положение на экране. Описание переменных опускаю, оно приведено на рисунке выше. Создаём обработчик события Формы OnCreate со следующим содержимым: procedure TForm1.FormCreate(Sender: TObject) ; begin AssignFile(SaveF, 'Init.ini') ; if FileExists('Init.ini') then begin Reset(SaveF) ; Read(SaveF, SaveV) ; Form1.Left := SaveV.X ; Form1.Top := SaveV.Y ; Form1.Caption:=SaveV.Caption ; //Наши переменные дополнительно сохраняют заголовок Формы! end ; end ; Теперь необходимо создать обработчик события OnClose : procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction) ; begin Rewrite(SaveF) ; //Нет необходимости проверять наличие файла, создадим его заново! SaveV.X := Form1.Left ; SaveV.Y := Form1.Top ; SaveV.Caption := Form1.Caption ; Write(SaveF, SaveV) ; CloseFile(SaveF) ; end ; В данном случае файл считывается и записывается туда, куда мы ему указали. Но необходимо также уметь выбрать нужный файл в работающей программе. Описание этого - в заключительной части урока. Предыдущий урок
В начало урока 7
Следующий урок Вопросы и комментарии (53) Решение задач в Delphi
Newsman, добавлено 8.05.10, 07:37:33
А как работать с текстовыми файлами? Автор, добавлено 8.05.10, 07:43:24 Я предпочитаю работать с текстовыми файлами с помощью компонентов, имеющих встроенные функции по чтению и записи текстовых файлов, например, TMemo, TListBox, TComboBox. Но, конечно, существование файла нужно, как и всегда, проверять функцией FileExists. Михаил , добавлено 22.05.10, 13:19:20 Народ , написалконсольную прогу по записям , но чтото не пашит. type mytype = record name:string[20]; password:string[20]; end; var f:file of mytype; a:mytype; begin Assign(f,\'file1.txt\'); reset(f); Read(f,a); WriteLn(a.name); Rewrite(f); read(a.name); read(a.password); Write(f,a); CloseFile(f); end. выдаёт ошибку EInOutError . Чё делать? Михаил, добавлено 22.05.10, 16:32:31 Всё помощь отменяется...разобрался.../ registr = record name,password:string[20]; end; var fil:file of registr; fils: registr; b,c:string; begin assignfile(fil,\'file1.txt\'); Reset(fil); Read(fil,fils); writeLn(fils.name); writeLn(fils.password); AssignFile(fil,\'file1.txt\'); Rewrite(fil); readLn(b); readLn(c); fils.name:=b; fils.password:=c; Write(fil,fils); CloseFile(fil); WriteLn(fils.name); WriteLn(fils.password); end. Александр, добавлено 8.06.10, 16:41:24 А как открыть файл с расширением .html в обычном режиме? Автор, добавлено 8.06.10, 18:28:16 HTML-файл по своей это сути обычный текстовый файл. Для текстовых файлов вместо Read, Write применяются операторы Readln, Writeln. А так всё то же самое. Файловая переменная создаётся типа TextFile, обычная - типа String. Вот например процедура открытия текстового файла:
Текст помещён в Memo для наглядности. Андрей, добавлено 21.07.10, 10:33:29 Есть несколько текстовах файлов. Например: Тип компьютера Многопроцессорный компьютер с ACPI Операционная система Microsoft Windows XP Professional Пакет обновления Service Pack 3. Необходимо чтобы осуществлялся поиск по строкам (пакет обновления,Операционная система... )и в другую форму происходила запись строк:Service Pack 3,Microsoft Windows XP Professional. Как это реализовать? Заранее Спасибо! Автор, добавлено 21.07.10, 13:36:17 Извини, Андрей, за задержку - работа. Этот вопрос больше относится к теме работа со строками. Есть функция поиска pos(Substr, Str) - возвращает позицию подстроки Substr в строке Str. Если подстрока не найдена, возвращается 0. Поэтому загружаем файл в Memo, и ищем построчно pos('Операционная система', Memo1.Lines[i]) pos('Пакет обновления', Memo1.Lines[i]) и т.д. Если подстрока найдена, берём её, удаляем первые символы, соответствующие длине подстроки (например, Операционная система - длина 20 символов) оператором copy, и записываем куда надо. Андрей, добавлено 22.07.10, 10:26:15 Спасибо!!! Николай, добавлено 29.07.10, 10:54:48 with OpenDialog1 do if Execute then Memo1.Lines.LoadFromFile(\'ASHARAP.txt\'); end; А если у меня около 50 файлов(все файлы текстовые), как написать код, чтобы не прописывать само название файла? Автор, добавлено 29.07.10, 12:00:17 Если Вы знаете их имена, то составьте массив из названий, и в цикле сохраняйте по номеру индекса массива. Если это папка с файлами, то, к сожалению, пока методы поиска файлов у меня не описаны, но планирую. Тогда этими методами ищутся все файлы, их имена сохраняются в массив - и т. д. Ольга, добавлено 17.12.10, 09:48:08 Большое спасибо, я разобралась!))) Вадим Мошев, добавлено 9.01.11, 16:54:27 Здравствуйте. У меня возникла следующая проблема и, следовательно, вопрос по её решению. У меня есть форма (1), при открытии которой у меня появляется ещё одна (2) модальная. Она нужна мне ТОЛЬКО для того, чтобы получить имя файла (имя файла я получаю при помощи OpenDialog1.FileName – это имя файла я присвоил глобальной переменной модуля 2 PathToFile), который я буду использовать в форме 1, а также для ввода строки, которая будет частью имени сохраняемого файла в форме 1. После получения имени файла и ввода необходимой строки, , которая будет частью имени сохраняемого файла в форме 1, модальная форма 2 закрывается. Форма 1 должна сохранять файл с именем, которое формируется в программе. Файл должен сохраняться в папку вместе с EXE файлом (вместе с программой), однако вместо этого файл сохранятся в ту же директорию, откуда был получен файл для работы в форме 1. Прошу помощи. Код прилагается. Модуль «формы 1»: unit Test; //............. Procedure SaveProtocol(Reason: Tstring); // Сохранить протокол тестирования в файл в директорию с программой var ProtocolName: string; P: TextFile; j, c, g, m, h: byte; STdate, STtime, TimeForTestString, STm, STh: String[12]; STStartDate, STfinishdate: string[19]; // дата и время начала и конца тестирования begin ProtocolName:=''; // Расчтитываем число полученных и верных ответов c:=0; g:=0; for j:=1 to N do if Question[j].Answered then inc(g); for j:=1 to N do if Question[j].Right then inc(c); // Получаем дату и время сохранения протокола STDate:=DateToStr(NOW); STtime:=TimeToStr(NOW); // Получаем дату и время начала и окончания тестирвоания STStartDate:=DateToStr(StartDate) + ' ' + TimeToStr(StartDate); StFinishDate:=DateToStr(FinishDate) + ' ' + TimeToStr(FinishDate); STm:=''; STh:=''; // Выделяем минуты, часы из переменной TimeFortest h := TimeForTest DIV 3600; m := (TimeForTest - h*3600) DIV 60 ; if TimeForTest = 0 then StM:='НЕОГРАНИЧЕНО'; // часы = минуты = 0 If H > 0 then StH:=IntToStr(H) + ' ч. '; If M > 0 then StM:=IntToStr(M) + ' мин.'; TimeForTestString:=STh + STm; // Производим замену некоторых символов в строках даты и времени StDate[3]:='-'; StDate[6]:='-'; STtime[3]:='-'; STtime[6]:='-'; // надо составить имя протокола ProtocolName:=BeforeTest.UserName + ' - ' + Discipline + ' - '; // Переменная Username в модуле BeforeTest получается так: // UserName:=Edit1.Text; // UserName:=TrimRight(UserName); // В edit1 не могут содержаться только одни пробелы ProtocolName:=ProtocolName + StDate + ' ' + STtime; {Имя протокола имеет вид: <Имя пользователя> - <Дисциплина> - <Дата и время сохранения протокола dd-mm-yyyy hh-mm-ss>} // Создаём файл, начинаем сохранение AssignFile(P, ProtocolName + '.txt'); ReWrite(P); ____________________________________ Модуль «формы 2» (модальной) unit BeforeTest; //............... procedure TForm5.Button1Click(Sender: TObject); // Нажата кнопка выбора вопросов var F: textFile; hours, minutes, N: byte; Dis: String[60]; Time: Word; StH, StM: String[13]; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); PathToFile := OpenDialog1.FileName; Reset(F); ReadLn(f, Dis); ReadLn(F, N); ReadLn(F, Time); CloseFile(F); end; //..................... Автор, добавлено 9.01.11, 17:40:27 Вадим, завтра утром приеду, разберусь. Автор, добавлено 10.01.11, 10:22:00 Вадим, извашего текста неясно использование переменной PathToFile, вы её только вычисляете, но не используете. Если она используется в адресе сохранения, то сохранение, естественно, будет туда, куда она указывает, а именно как вы и пишете, в папку, откуда получен файл для работы. Ну это просто к слову. Вот как можно найти папку, где находится EXE-файл программы: Path:=ExtractFilePath(Application.ExeName); Далее прибавляйте само имя файла, и сохраняете. Добавлю, что само имя файла (без пути) получается как ExtractFileName(OpenDialog1.FileName) Вадим Мошев, добавлено 10.01.11, 21:44:10 Да, спасибо большое, всё работает. До моего сведения довели, что Диалоги (Save/open dialog и др) изменяют текущий каталог... Автор, добавлено 11.01.11, 12:08:30 У меня другое мнение, что диалоги как раз ничего не делают, просто предоставляют пользователю сделать выбор, и всё. И плохо было бы, если бы они своевольничали. А каталог, который откроется, задаётся свойством диалогов InitialDir. Антон, добавлено 1.02.11, 21:08:20 Вопрос: оператор Reset (или Rewrite) открывает файл в отдельном окне, или же он открывает его толь для программы и работать с ним может только программма? Если верен последний вариант, тогда ка можно открыть файл в отдельном окне так. что бы пользователь мог так же работать с ним? Автор, добавлено 1.02.11, 21:36:26 Антон, я едва понял ваш вопрос! Не нужно путать! Открыть новое окно в программе и открыть файл операторами reset или rewrite - не одно и то же. Открыть файл операторами reset или rewrite значит подготовить его для работы с ним, т.е. чтения или записи. Чтобы пользователь мог работать с файлом, нужно сначала его открыть в программе, считать, поместить содержимое в какой-нибудь компонент, например, в текстовый редактор или таблицу или ещё в какой Сам компонент можно и в новое окно поместить, чтобы в основной программе не мешался, если вам так хочется. Аноним, добавлено 2.02.11, 21:08:08 Нет, я имел ввиду не то. Могу ли я сделать так, что бы по нажатию на кнопку поя программа запускала файл через ту программу из которой он был создан. Проще говоря: у меня есть некая книга excel, я запускаю свою программу, делаю в ней, что необходимо, и моя программа запускает excel, а в нем ту самую книгу. Т. е. открытое окно к написанной мной программе уже никакого отношения не имеет. Такое возможно? Автор, добавлено 3.02.11, 09:24:01 А, вот вы о чём... Конечно, есть функция, открывающая любые документы ассоциированными с ними приложениями. То есть, чтобы запустить, например, Excel с загруженным в него документом, нужно:
Для работы этой функции нужно добавить в uses модуль ShellAPI. Вообще говоря, функция возвращает значение дескриптора открытого приложения. И если значение меньше или равно 32, то значит произошла некая ошибка. Но можно её вызывать и непосредственно, как выше. Естественно, для использования с OpenDialog 'адрес_документа.xls' заменяется на OpenDialog1.FileName. Первый nil означает операцию, которую нужно проделать с файлом. Например, 'print' распечатает текстовый файл или файл Word. Просто nil эквивалентно 'open', файл просто откроется в своей програме. Нужно добавить вот что: адрес документа д.б. типа PAnsiChar. И если записать его в переменную adres типа String, то нужно её предварительно преобразовать: PAnsiChar(adres). Это касается и OpenDialog1.FileName. Аноним, добавлено 3.02.11, 20:33:36 Ооооооочень помогли, только единственный вопрос куда добавлять адрес документа типа PAnsiChar? Как я понял в параметры функции. Автор, добавлено 3.02.11, 21:14:21 Смысл вот в чём: если адрес пишется вручную, то достаточно заключить его в кавычки, правильно? Но тогда его пользователь не сможет изменить. Чтобы его можно было менять, нужно его присвоить переменной. Но у нас переменные, том числе и OpenDialog1.FileName - типа String, а функция работает с параметром типа PChar: ShellExecute(Handle, nil, PAnsiChar(OpenDialog1.FileName), nil, nil, SW_RESTORE); Антон, добавлено 5.02.11, 11:15:37 Все, сообразил. Премногоблагодарен))))) Назия, добавлено 22.04.11, 14:14:40 Здравствуйте! Подскажите,пожалуйста,что я делаю не так? На форму поместила TSQLConnection. В инспекторе объектов не удается установить значение TRUE на вкладке Database->Connected. Пишет,что связь установить не возможно,хотя сервер запущен. Пользователя и пароль указываю. Может быть причина в том,что в списке для выбора ConnectionName нет RSQL? Как его туда добавить? Автор, добавлено 22.04.11, 21:35:45 Назия, извините, я затрудняюсь ответить на ваш вопрос. Я не имею сейчас задач с серверами баз данных... Так что советую вам обратиться к тем, кто сходу может ответить на ваш специализированный вопрос, я лично сам так делаю: programmersforum.ru. Там есть ветка про базы данных. Приятный собеседник добавлено 17.06.11, 05:43:36 не хера не пойму. не пашет. Автор, добавлено 17.06.11, 05:48:21 Тисните текст программы, посмотрим что не так Сергей, добавлено 17.10.11, 13:41:57 Можно ли сделать так, чтобы программа собирала несколько файлов в один? Всмысле, есть, допустим 3 файла .doc, которые надо записать в один. По порядку. Автор, добавлено 17.10.11, 15:38:50 Да, это можно. Но для этого нужно освоить работу с компонентами палитры Servers или с объектами COM. То есть, найдя документ, его нужно загрузить в Word (пусть невидимый), добавить следующий и так далее. А затем сохранить результирующий документ. Антон, добавлено 18.10.11, 10:13:43 Такой вопрос : Если я хочу что бы в моей программе были кнопки запускающие другие программы. Возможно ли сделать так что бы другие программы устанавливались вместе с моей программой. Где почитать как это сделать З.Ы. Прошу по голове не бить... В программировании новичок Антон, добавлено 18.10.11, 10:18:22 Другие программы, к примеру AutoCAD, Word, InternetExplorer Автор, добавлено 18.10.11, 10:21:50 Встречный вопрос: а как вы собираетесь устанавливать собственную программу? Готовый проект работает без установки. А для собственно установки есть программа, по-моему InstallShild называется, она даже в поставку Delphi входит, возможно не во всякую. Там можно задать что именно будет устанавливаться. Всё это будет запихано в дистрибутив, и впоследствии будет установлено. Но вот с такими пакетами как Autocad или Office это вряд ли пройдёт. Для запуска программ из вашего приложения есть функция WinExec('file.exe', SW_RESTORE) Жека, добавлено 18.11.11, 16:21:41 Подскажите пожалуйста как открыть созданный в Дельфи exe фаил, если исходник утерян???? Автор, добавлено 18.11.11, 17:26:44 Вам, видимо, нужно восстановить исходник, а не открыть exe-файл? Программы, которые помогают частично восстановить исходник, называются декомпиляторы. Поищите в Гугле "восстановить исходник по exe файлу delphi". Или уточните ваш вопрос. Жека, добавлено 20.11.11, 08:13:59 Спасибо за подсказку!!!! Сергей, добавлено 24.03.12, 18:08:27 Добрый день. Спасибо Вам за столь информативный сайт. Я только начинаю работать с Delphi 7, и на первых же порах не смог разобраться с построчным чтением из текстового документа. Задача: в коде программы указать путь к текстовому документу в котором построчно написаны номера телефонов, эти номера нужно вывести по одному в форму с добавлением строки "добавлен". Заранее спасибо. Автор, добавлено 24.03.12, 18:44:13 Что значит вывести в форму? Другое дело в компонент, обычно в Memo. Можно считать из файла весь документ, и затем обработать, добавить или изменить что-то. Я пишу с телефона, код будет в строку. Считать: Memo.Lines.LoadFromFile('ИмяФайла'); Добавить в каждой строке: for i:=0 to Memo.Lines.ColCount-1 do Memo.Lines[i]:=Memo.Lines[i]+' то-что-нужно'; Сергей, добавлено 24.03.12, 19:03:56 Спасибо. Буду разбираться с MEMO)) Немного не точно выразился, но Вы сами прекрасно все поняли и объяснили то что нужно) Еще раз спасибо, и процветания Вашему проекту! Сергей, добавлено 24.03.12, 20:17:47 С МЕМО разобрался, получилось так как и было запланировано. Теперь второй вопрос. Полученные построчно записи нужно изменить по порядку. Вопрос: Как дополнительно в коде видоизменять построчные данные? Т.е у меня есть массив 123123,1233333,3123123,4121412 нужно что бы каждая запись участвовала в дополнительной программе. Я понимаю что через While должно делаться но не могу понять как скомповать эту функцию с for. Сергей , добавлено 24.03.12, 23:42:24 Спасибо. Вопрос снят с повестки) Разобрался)) Просто после for i:=0 to Memo.Lines.ColCount-1 do нужно было набрать begin и далее программу)) Еще раз спасибо) Елена, добавлено 6.04.12, 12:21:28 Здравствуйте, уважаемый Автор! Понравились ваши уроки и ваши толковые ответы. Помогите, пожалуйста, в решении производственной задачи. Раньше работала такая схема: подготовка файлов DBF в программе Clipper и их закачка в БД Oracle программой DELPHI с использованием BDE. Теперь, после сокращения оператора, данные из подразделений приходят в WORD (предприятия раскиданы по республике). Сейчас мы их преобразовываем: DOC->TXT->формирование DBF программой Clipper (там есть такая возможность). Структура файла WORD: (заголовок пачки 1) (строка 1 пачки 1) (строка 2 пачки 1) … (заголовок пачки 2) (строка 1 пачки 2) (строка 2 пачки 2) … END Строки и заголовки по тексту отличить можно. Все заголовки начинаются так '(701 ', а строки так '(1 '. Заголовки и строки заключены в скобки. Текст 'END' -конец файла. Цель: DOC преобразовать в DBF-файлы средствами DELPHI для последующей закачки в БД. Для этого надо сформировать файлы заголовков пачек и файлы содержимого пачек. Имена файлов должны содержать номера пачек. Выбрать Документ и поместить его в RICHEDIT для просмотра получилось, а как работать с его содержимым по строкам, причем последовательно, не могу придумать, совсем нет опыта работы с документами. Вывести записи в DBF и отобразить результаты на экране тоже смогу. Спасибо. Автор, добавлено 6.04.12, 13:47:58 Посмотрите эту статью: Компонент Memo Все основные методы одинаковы и для RichEdit. А если будут особенности, пишите, а то я сам всех ваших требований угадать не смогу. Кстати, возможно просто перенести весь документ в Memo: Memo1.Lines:=RichEdit1.Lines; Конечно, элементы форматирования исчезнут, т.к. Memo их не поддерживает. Но если нужен только текст... Ну, по-быстрому, содержание строки с индексом i (отсчитывается от нуля) равно: S:=Memo1.Lines[i]; Символ с номером n (отсчитывается от 1) от начала строки: S:=S[n]; Ну или сразу S:=Memo1.Lines[i][n]; Кстати, Memo сохраняет именно в .txt формат файла: Memo1.Lines.SaveToFile(FileName+'.txt'); Расширение конечно может быть любым, но формат всё равно - .txt Елена, добавлено 6.04.12, 15:45:42 Спасибо за быстрый ответ. Чтобы решить проблему, надо поделиться ей с другом))). Уже начала работать через ListBox. ListBox1.Items:= RichEdit1.Lines; (можно и Memo.Lines) - потом построчный анализ и т.д. От txt как раз хотим освободиться. Всего хорошего! Аноним, добавлено 31.12.13, 02:57:24 SaveV.X := Form1.Left ; SaveV.Y := Form1.Top ; что значат буквы X и Y ? после SaveV ? Руслан, добавлено 31.12.13, 02:58:13 SaveV.X := Form1.Left ; SaveV.Y := Form1.Top ; что значат буквы X и Y после SaveV ? Автор, добавлено 31.12.13, 05:36:06 Это программа из первой части урока про файлы, там есть ссылка на него. Вообще, мы запоминаем координаты. SaveV - это переменная, описанная как запись с полями X и Y - для сохранения координат по X и по Y, доступ к полям записи осуществляется через точку. Петр, добавлено 7.02.14, 11:45:20 Здравствуйте, Автор! Большая польза почитать Ваши уроки. Спасибо. Но не нашел у Вас следующего (или прозевал): как красиво создать в Делфи таблицу, заполнить ее и отослать в Word для дальнейшего редактирования и т.д.? Туда же и графику Image. Так возможно? Спасибо. Автор, добавлено 7.02.14, 13:25:18 Вам придётся создавать в Word таблицу и переписывать в неё данные из вашего delphi-проекта. Я этого никогда не делал, и на сайте не описывал. Сейчас посмотрел, есть ответы в сети, как это можно сделать. Петр, добавлено 7.02.14, 13:48:57 Спасибо, я буду искать. А принцип создания файла Word и передачи в него графики Image можете привести? Автор, добавлено 7.02.14, 14:43:01 Вот так создаются и Word и Excel:
Как работать в Word с графикой, учить не имею полного права - никогда этим не занимался. Но вот метод как добавить картинку в место расположения курсора, с одного сайта "срисовал", и исправил ошибки:
Можно и без диалога, тогда нужно определить переменную FileName, вставить нужный адрес файла. Петр, добавлено 7.02.14, 19:08:56 Большое спасибо. Интернет-магазин электрооборудования |
|