Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на DELPHI v3-7 Текстовый редактор


Информационный Канал Subscribe.Ru

ПРОГРАММИРОВАНИЕ НА DELPHI v1-7 Кол-во подписчиков: 6000+

  САЙТ/АРХИВ РАССЫЛКИ ::  НАШИ OFFLINE-ЖУРНАЛЫ   :: ФОРУМ

 Привет вам, дельфяне!

Мне очень часто приходят вопросы по написанию текстового редактора в Delphi. И причём все они практически не отличаются друг от друга. Вот я и решил написать статью не эту тему. Думаю она будет интересна только новичкам:)

В этом выпуске:

1)Пишем свой первый текстовый редактор-->
2)
Ответы-->
3)Вопросы-->

СТАТЬИ 

Пишем свой первый текстовый редактор


Думаю, что если вы читаете эту статью, значит вы новичок в программировании, и возможно Delphi видите в первый раз. Скажу сразу, что Delphi-это не язык программирования, как утверждают многие начинающие программёры, а среда разработки программ. Сам язык именуется Паскалем(paskal) , в честь небезызвестного французского философа Блеза Паскаля. Это так, лирическое отступление:))

Ну что ж, приступим. Откройте Delphi. Теперь нажмите File->New->Application. перед вам должно появиться два окна: Unit1.pas и Form1. Первое окно- это код( тут будут располагаться ваши алгоритмы и прочее.) А вот второе- это форма ,т.е так будет выглядеть ваше приложение. Если посмотреть немного выше, то вы увидите палитру компонентов, а на ней множество вкладок и самих компонентов.

Теперь перейдём непосредственно к программированию. Выберите из палитры компонентов (вкладка Standart) компонент TMemo, и щёлкните по нему два раза. Стоит заметить, что при помещении объекта на форому, ему присваивается уникальное имя(т.е TMemo будет называться memo1, а если положить на форму ещё один компонент TMemo, ему присвоится имя memo2, и т.д). Теперь он есть у вас на форме, и вы можете изменять его размеры, и т.д.Выберите его левой кнопкой мыши и перейдите в Инспектор Объектов (Object Inspector) тут вы видите параметры этого объекта, и их значения (параметры слева, а их значения справа). Найдите там параметр Align и поставьте его значение в alClient, как вы уже наверное успели заметить memo1 растянулось на всю форму(это нам и нужно).Теперь, перейдите на вкладку Win32 палитры компонентов и поставьте(кликнуть два раза) на форму компонент ToolBar. Далее(уже на форме) выделите ToolBar1 правой кнопкой мыши в нажмите New Button. У вас должна была появиться кнопка в ToolBar. Повторите эти действия ещё 2 раза. Затем перейдите на вкладку Dialogs палитры компонентов, и поставьте на форму компоненты OpenDialog и SaveDialog(это диалоги загрузки и сохранения файлов). Опять вернитесь к ToolBar1 и кликните по первой кнопке два раза. Вы должны были оказаться в окне Unit1.pas, и перед вами должен был появиться следующий код:

procedure TForm1.ToolButton1Click(Sender: TObject);
begin

end;


Объясню сразу, то, что вы сейчас видите, это обработчик события OnClick(Клик по кнопке) Кнопки ToolButton1 на ToolBar'e. Этот код выполняется по щелчку на кнопке ToolButton1. вставьте между словами Begin и end; следующий код:

if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

У вас должно было получиться следующее:

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

Нажав на F9 вы увидите своё приложение, и сможете загрузить текст из файла в Memo1.

Сейчас, когда вы уже немного наигрались, можно приступить к работе. Нам опять нужно вернуться к ToolBar, теперь же, кликните по второй кнопке два раза, и впишите в обработчик события OnClick, следующий код:

if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);

Вот то, что должно было получиться:

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;

Сейчас, ваше приложение уже умеет сохранять текст. Осталась последняя кнопка, в её обработчик события OnClick следует вписать всего одно слово: Halt. Эта кнопка будет выходом.

Как вы уже наверное заметили, на этих кнопках нет картинок, и поэтому он не смотрятся. Поставьте на форму компонент ImageList со вкладки Win32, и кликните по нему два раза. Вы оказались в диалоге добавления картинок. Нажмите на кнопку Add... и добавьте три понравившиеся вам картинки для кнопок. Когда вы добавляете картинку, ей присваивается индекс, его вы можете увидеть под картинкой. Нажмите на ОК. Выберите ToolBar(один щелчок) и измените его свойство(в инспекторе объектов) Images на имя вашего ImageList(ImageList1).У вас теперь есть картинки на кнопках! Но если вдруг картинки встали не так, как полагается, вы можете сами назначить картинку для кнопки, это можно сделать, указав ImageIndex(в свойствах кнопки) на индекс нужной вам картинки.

Теперь нам нужны полосы прокрутки для memo1, поставьте свойство (memo1) ScrollBars в ssBoth.

Осталась последняя деталь. Если текстовый файл открывают с помощью вашего приложения(Открыть с помощью...) то он не открывается, а просто загружается ваше приложение. Выберите в инспекторе объектов объект form1 и перейдите на вкладку Events. Затем кликните два раза напротив надписи OnCreate. Вы должны были оказаться в обработчике события OnCreate(вызывается при построении формы) впишите туда следующий код:

if ParamCount > 0 then
Memo1.Lines.LoadFromFile(ParamStr(1));

Ну, вот, готов ваш текстовый редактор. Надеюсь, что вы напишите ещё уйму нужных и качественных программ.

На этом всё! Angel

НОВЫЕ ОТВЕТЫ

Вопрос #35 от wasilla

Народ, здрасте !
Народ, я занимаюсь базами даных, но я еще учюсь, и следовательно мне надо будет сдавать сесию. У кого есть хорошая обучаловка по сабжу, киньте пожалуйста в мыло, или дайте хороший совет с чего начать.
e_mail:
vasil@dubno.dcagro.com

Отвечает Diver

сходи на сайт http://www.vr-online.ru/ Там выложены около 10 номеров журнала VR-Online, а в них кроме всего прочего описание работы с базами данных. А ещё отличный ресурс - http://gamedev.bib.com.ua/

Diver

Отвечает Gluk

У меня есть фак, но там много ещё всякого дерьма по этой самой
делфе, и весит соответственно 52 метра, 2500 статей отдыхают :)


Вопрос #36 от Гришин Дмитрий

Всем привет.
Хотелось бы найти набор компонент (кнопки, чекбоксы, радиокнопки, гриды и т.п.), которые бы имели вид, полностью аналогичный виду сооветствующих элементов управления и редактирования в Windows XP. Для примера можно взглянуть на интерфейс программы SnagIt 7.0 (
www.snagit.com). Устроит также невизуальный компонент, переопределяющий вид элементов, как например, это делает XP Menu (но это не совсем дизайн ОС WinХР, а, скорее, дизайн MS Office XP).
Заранее огромное спасибо!

Отвечает Dynamic

Ходи сюда
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1064667095&n=0

Отвечает Photus

http://devexpress.com

Отвечает Kirill Atyashkin

Посмотри BusinessSkinForm

Отвечает Gluk

А можно просто установить delphi7 и перетащить из....... вообщейм
поставь на форму XPmainfest


Вопрос #37 от Reno

Привет!
У меня вопрос - как засунуть прогу в System Tray ?

Отвечает KSTU Webmaster

В Delphi начиная с 6 версии
и в C++Builder с 5 есть
компонент TTrayIcon, вот его и нужно
использовать, присвоив при этом значению
Visible гл формы проекта значение false,
т.е форму видно не будет.
Для Delphi более ранних версий
нужно создавать свой объект
и через функции API Windows делать
то же самое, как это делается длинная история,
если заинтересует то пиши на webmaster@kstu.edu.ru
и поставь тему письма "Программирование на delphi"

Отвечает Alexandr Belayev

Используй компонент RxTrayIcon из набора компонентов RX, или любой
подобный. Можно всё ручками. Тогда смотри функцию ShellNotifyIcon.

Отвечает santi@tut.by

Юзай классыую компаненту RXTrayIcon из RxLib! Там можно делать, всё что угодно! Супер штука!

Отвечает Dynamic

Ходи сюда:
http://www.delphimaster.ru/cgi-bin/search.pl?words=Tray&n=0

Отвечает Gluk

Мдя :) ну можна кампонент скачать называется CoolTrayIcon весит мало
так чта качай..... А если ты так хошь узнать то я не заню не
углублялся :)

Вопрос #38 от Буланов Сергей

Привет всем!!!
У меня такой вопрос: где в Internet можно найти хорошее описание Delphi?
Заранее спасибо!
Сергей.

Отвечает Mihail

Я, например, нашел, и не мало, но всё-таки, для того, чтобы была необходимая база знаний, нелишне под рукой иметь хоть средней паршивости книгу, оно по-старинке обучение идет как-то эффективнее.
А если невтерпеж, или денег на литературу нет, то вот тебе ссылочка, может поможет http://atrussk.ru/delphi/

Отвечает santi@tut.by

В поисковиках... Ну я если серьёзно, то лучше на рассылки подпишись и на форумы походи и статейки почитай... И всё! Больше ничего не надо! (Ещё можешь 1000страничную книжечку купить (хотя это не И-нет))

Отвечает Alix

См. www.Vr-Online.ru, "Библия Дельфи", а Horrific - rulez! Очень
советую найти и прочитать его (Михаила Фленова) книгу "Программирование
в Delphi глазами хакера" - хакерства там не много, зато ее писал
программист и она очень легко читается. Кстати, я - Alix, а не
Horrific :)

Отвечает Gluk

Самоучебник чтоль :D гы гы 52 метра :), кажется на www.delphiFAQ.ru


Вопрос #39 от Alex

Здравствуйте,

Я только начал работать с базами данных в Делфи, и у меня появлилсь такие вопросы.
1. Почему DBGrid при растягивании формы (и соответственно, сетки), не меняет своих размеров? Как их можно тоже менять в зависимости от размеров формы, а то получается очень страшная картина (размер полей не поменялся, а таблица растянулась и стало куча свободного места).
2. Если у меня первое поле с названием ID является AutoIncrement, то оно увеличивается на 1 с добавлением каждой записи (это понятно), но вот если у меня текущая запись, скажем, 15, то после ее удаления и добавления новой записи получатеся такая картина в поле ID: ...,12,13,14,16,... Почему новая запись продолжается под номером 16, а не 15? Это можно исправить?
3. Есть ли лучшие средства для работы с БД (локальной), чем Paradox + DBGrid?

Отвечает Пищулин А.И.

>1. Почему DBGrid при растягивании формы (и соответственно, сетки), не
меняет своих размеров?
Поиграйся с параметром Align грида. Он растягивает Грид до ограничителей.

>2...Почему новая запись продолжается под номером 16, а не 15? Это можно
исправить?
Это не нужно исправлять. Пока просто поверь - когда поработаешь с базами
данных побольше поймешь, почему.

>3. Есть ли лучшие средства для работы с БД (локальной), чем Paradox +
DBGrid?
Вместо Paradox используй Interbase.

Отвечает Dynamic

Придется использовать сторонние компоненты, например для локальных баз рулит компонент TDBF(http://sourceforge.net/projects/tdbf).
Поле autoinc не надо использовать для отображения нумерации строк, оно нужно для поддержания ссылочной целостности базы, нумерацию надо делать самому, или опять же - чужие компоненты.

Отвечает Photus

1. Посмотри свойства Align у грида и свойства Constraints у формы.
2. Нет. Автоинкремент - это автоинкремент. ИМенно так он и работает. Это как раз и даёт нам уверенность что в поле с автоинкрементом не будет одинаковых значений вообще никогда.
3. Есть. НО твои пересиленные - это самые доступные. :). Хотя если ты когда-нибудь увидишь DevExpress QuantumGrid( http://devexpress.com ) ты поймёшь всю слабость стандартного грида.


Вопрос #40 от Золотарёв Сергей

Кто знает как узнать имя процесса по его хендлу?
Т.е. есть у меня переменная типа THandle (к примеру H).
Так вот я вызываю GetModuleFileName(H) - а она возвращает имя модуля
моей проги, хотя хендл к примеру указывает на рабочий стол... Как это
лечить???

Отвечает Dynamic

1 способ

function GetFilePath(const WinH: THandle): String;
var
SnapshotH: THandle;
PE32: TProcessEntry32;
PrId: Cardinal;
begin

Result := '';
SnapshotH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapshotH = -1 then Exit;
PE32.dwSize := SizeOf(PE32);
GetWindowThreadProcessID(WinH, PrId);
if Process32First(SnapshotH, PE32) then
repeat
if PE32.th32ProcessID = PrId then begin
Result := PE32.szExeFile;
Break;
end;
until not Process32Next(SnapshotH, PE32);
CloseHandle(SnapshotH)
end;

-------------------------------------------
2 способ

function GetAppFileName (hWnd: THandle) :string;
var dPID: dWord;
hHandle: THandle;
begin
GetWindowThreadProcessId(hWnd, @dPID);
SetLength (Result, MAX_PATH);
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0
then SetLength (Result, StrLen (PChar (Result)));
end;

procedure TForm1.FormCreate(Sender: TObject);
var Handle :THandle;
begin
Handle := FindWindow (nil, 'Microsoft Excel - Книга2');
Edit1.Text := GetAppFileName (Handle);
end;

Отвечает Gluk

Берём телефон и звоиним 03


Вопрос #41 от Voronin N.A.

Привет ВСЕМ.
Есть такой вопрос.

Как отловить нажатия мыши на заголовке (фиксированные строки StringGrid-а).
Например для вызова сортировки по определенному столбцу (код сортировки мне
в
принципе не нужен), не используя
сторонних компонентов типа StringGrid.
Кто знает пожалуйста напишите
vornik@mail.kz

Отвечает Dynamic

эт вопрос уже был кажись...


Вопрос #42 от Рюриковичи мы

Здравствуйте!

ВОПРОС: Как определить размеры файла/папки?
FileSize работает только с уже открытым файлом.
Можно только через него?

Спасибо.

Отвечает Alix

Пазмер папки - размер файлов внутри нее, а также файлов внутри ее
подпапок и файлов внутри подпапок ее подпапок и... Короче у меня
давно есть процедурка, которая сканирует папку и ее подпапки. Держи:

procedure TraverseDir(path:string);
var sr:tSearchRec;
s:string;
begin
chdir(path);
findfirst(path+'\*.*',faAnyFile,sr);
repeat
if (sr.name='.') or (sr.name='..') then continue;
if (sr.attr and faDirectory)=0 then begin
listbox1.items.add(path+pathdelim+s.name);
descr.Caption:=path+pathdelim+sr.name;
end else begin
traversedir(path+pathdelim+sr.name);
chdir('..');
end;
application.processmessages;
until (findnext(sr)<>0);
end;

Поясняю - в listbox1:TListBox заносится список всех найденных файлов,
заменяй на что хошь, напр. переменную типа TStringList, чтоб юзер
не видел имена файлов. descr - это просто TLabel, можешь удалять.
PathDelim='\' (для Выньдос). Чтоб юзера не хватил инфаркт (если
каталог имеет большой размер, то прога не будет реагировать его
реакции) поставлено application.processmessages. Короче, все что
тебе нужно - определить размер каждого файла в списке найденных и
найти их сумму, думаю это ты умеешь.
А определие размера файла насчитывает аж 3 сособа:
=1. Открыть файл и перейти в конец===============================
var f:hfile;
filesize:integer;
begin
f:=_lopen(PChar(FileName), OF_READ);
FileSize:=_lseek(f,0,FILE_END);
_lclose(f);
end;
=2. Основан на поиске файлов, кот. возвращает размер=============
var SearchRec:TSearchRec;
FileSize:integer;
begin
if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec)=0 then
FileSize:=SearchRec.Size;
FindClose(SearchRec);
end;
(В процедуре TraverseDir можешь ничего не добавлять ни в какой список, а
сразу складывать размеры, только переменная суммы должна быть внешней :))
=3. Воспользоваться функцией GetFileZize=========================
function GetFileSize(hFile:THandle,
lpFileSizeHigh:Pointer):DWORD;stdcall;
hFile - указатель на файл, второй парам - указатель на число DWORD,
када будет помещен старший байт размера файла (у тебя есть файлы
размером больше 2Гб? Нет, тогда ставь nil), возвращает младший байт
размера файла.
( Спасибо Horrific'у за его книгу, и эти 3 способа из нее)

Отвечает Dynamic

Рекурсивным обходом всех подкаталогов.

Отвечает Gluk

Пожалуйста :)


Вопрос #43 от santa_k

Привет, дельфисты!!!
Помогите. Не могу разобраться в Rave Raports 5 для Delphi7.
Например, как добавить в DataVewDictionary->DataView новую запись
DataView2FieldName и вообще где можно взть толковую литературу по
этому направлению, а также толковые чаты или форумы. Спасибо.

Отвечает Gluk

Хм хм 52 метра :)


Вопрос #44 от Voronin N.A.

Всем привет.
Тут опять вопросец имеется.

Необходимо один столбец StringGrid-a заполнить CheckBox-aми и работать с
ними
как с нормальными объектами (компонентами).
Знаю про StringGrid.Objects[i,j], присваиваю ему (предварительно создав)
какой либо CheckBox но потом не могу с ним ничего делать.
Кто знает как по-человечески работать помогите.

Отвечает Gluk

Это проблема решается в делфи5 легко, там нажимаешь правой копкой
мыши и, вообщем передвегаешь на передний план обьект, а в следующих
версия делфи я этого не замечал 8\


НОВЫЕ ВОПРОСЫ

Напоминаю всем, что свой вопрос вы можете задать по адресу delphi@goldfaq.ru с темой VOPROS

Вопрос #45 от Верушкин Сергей

Привет всем,

Меня интерисует работа реестром в Windows. Как прочитать данные из
опеределйнного ключа и как их записать в TEdit.
И ещё меня интерисует запуск другой программы из Delphi7
 

ОТВЕТИТЬ


Вопрос #46 от Даниил

Как сделать, чтобы моя прога (аналог блокнота) при открытии файла
через конт. меню Windows "Открыть с помощью" его открывала, а не
просто сама запускалась?

ОТВЕТИТЬ


Вопрос #47 от Александр

Здрасте!
Если кто-нибудь знает, как при помощи IdFTP и IdFTPServer (или других вещей Delphi 7) связать два удаленных компьютера через модем (но не через интернет) для передачи файлов, пожалуйста расскажите.

ОТВЕТИТЬ


Вопрос #48 от Шпаковский Алексей

Если кто-ни будь знает, как сделать свой SysTray (в Explorer'е - область рядом с часами), в котором отображались бы
иконки после вызова функции Shell_NotifyIcon, напишите, пожалуйста, хотя бы в общих чертах (какие для этого есть
WinAPI функции). Только не надо мне объяснять, как _запихнуть_ туда иконку, я это и так умею (сам только что ответ
написал). Буду очень признателен.

ОТВЕТИТЬ


Вопрос #49 от Pavel Grigoriev

Здраствуйте все !
У меня такой вопрос, можно ли написать WebBroser работаюший через прокси. Если да, то как и какие компоненты нужно использовать.

ОТВЕТИТЬ


Вопрос #50 от Евгений Р.

Здравствуйте!
Неожиданно интересные ответы нашел в Вашей рассылке.Может быть и мне кто сможет помочь:
У наследников класса tObject есть метод MethodAddress, который добросовестно определяет наличие метода у объекта и возвращает его адрес (если метод описан в разделе Published):
pProc:=obj.MethodAddress(procName);
Воспользоваться полученным адресом можно только из ассемблера:
asm
mov eax, [obj]
mov edx,[p1]
mov ecx,[p2]
call pProc;
End;
Параметры p1 и p2 - ссылки на параметры процедуры.
Разобраться с этим смог просматривая генерируемый код в отладчике.
Ондако не разобрался: как быть, если у процедуры более 2-х параметров, если параметры размером >4 (например double),
как получить результат функции, можно-ли гдето найти список методов объекта, их параметры.
Зараннее благодарен,
Евгений Рачек.

ОТВЕТИТЬ


Вопрос #51 от Антон Зайцев

Доброго времени суток.
Многие наверное видели программы типа "Говорилка".
Хочу тоже такую программу написать в Delphi.
Намыльте мне пожалуйста документации или дайте ссылку в интернет, где
копать.
Заранее благодарен.

ОТВЕТИТЬ


Вопрос #52 от Ruslan H


Срочно нужна помощь!

1. Как мне запустить приложение на удаленной машине.
2. Как там же его завершить. (Сеть локальная, TCP/IP).

Заранее пасибо!

ОТВЕТИТЬ


Вопрос #53 от lvamail

Всем салют!

Следующий вопрос-проблема:
подскажите код инициализации com-порт для приёма-передачи данных.
Зараннее благодарен.

LVA

ОТВЕТИТЬ


Вопрос #54 от slavak

Недавно делфи начал изучать, возник вопросик. Хочу
прогу написать,
которая считает время когда я в инете. Какая-то функция
есть что-ли?!
ПИШИТЕ ПОДРОБНЕЕ, если компонент необходим, пишите
ссылку. Заранее
Благодарен :)

ОТВЕТИТЬ


Вопрос #55 от Сергей

У меня такой вопрос:
Есть база данных, в Memo- поле заносится текст, как осуществить поиск или фильтрацию по ключевым словам этого поля.

ОТВЕТИТЬ


Вопрос #56 от Даниил

Как реализовать поиск в memo, чтобы работали допфункции (вперед,
назад, с учетом регистра, слово целиком)?

ОТВЕТИТЬ


Ведущий рассылки Angel     Дизайн "LikSoftGroup - Design"  12-ый выпуск



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное