Лекции по делфи
Массивы символов
Для работы с массивами символами предусмотрены тип указателей (это типа Pchar )это указатель, var
PMchar :Pchar= ….память 4 байта;
Если не инициализирую то значения будет null;
Если вы не задали значения переменное типа Pchar, то
Необходимо помнить о том что если мы будем записывать в перемен. Типа Pchar, то нужно позаботиться заранее о будущем размере строки!! нужно #0#0#0 итд сколкьо тебе нужно размер
Однако во многих задачах, приводиться работать с типом Pchar, во всех используются айпи функции, В этих функция очень часто в переменных строгого типа используют Pchar…
Строки разных типов могут присваиваться и смешиваться с разными типами :
Предположим что у нас куча переменных разного типа …
Var
S1:AnsiString;
P1: Pchar;
{инициализация}
S1:=Р1;{а вот обратное операция не допустимо!!!!Р1:=S1…тоесть я пытаюсь указателю присваиваю строку }
P1:= Pchar({и указал источник инфор..}Edit1.text)
Edit1.text:=P1;
………………….
Пример …..
…………………
Application. MessageBox
Function MessageBox(text, caption: Pchar;Flag:Longint):int;
….
S1{строковая переменая }
Application. MessageBox(Pchar(S1), Pchar(S2),MBICONExcemetation{подчеркивания })
Pchar – делать совместимости с айпи функциями
ФОРМАТИРОВАНИЯ ОКОН РЕДОКТИРОВАНИЯ
Формат текста свойством фонт (Font){изменения цвета и фона },Свойство Font доступна всегда!
Для изминения отрибутов
FontDialog(находиться в библиотеки в Dialogs)
Пентаграмма «F»-
Компоненты Dialog –
Как заставить обработчик событий который может изменять шрифты … основной метод которому больше всего обращаться это метод Execute, это функция возвращает либо True or False … стандартные обращении к Dialog if (имя компонента s. Execute) then (операторы использующие выбор пользователей )…
………………….
Пример…….
………………….
Тут типа заголовок!!!
1) FontDialog1.Font. Assign(Memo1.Font);
2 ) if FontDialog1.Execute Then Memo1.Font. Assign(FontDialog1.Font);
Активизировать кнопку применить в окне диалога …на этапе проектирования нужно использовать свойство Optious (в этом свойстве находим FdAppLybutton)для кнопки нужно написать обработчик событий
Memo1.Font. Assign(FontDialog1.Font);
Окно редактирования RichEdit(на страницы win32)особенностью этой компоненты то что она может работать в расширение RTF, а вторая особенность в Мемо поле мы могли форматировать весь текст, а в этом можно и отдельные части !!…
Во многих окнах редактирования отличаться время выполнения!!!
Свойство:
1)SelLength(длинна выделенного текста )
2)SelStatr(адрес начало выделенного текста)
3)SelText(содержит весь выделенный текс)
В окне RichEdit, атрибуты выделенного текста определяться свойством SelAttributs
Обработчик событий который меняет шрифты в RichEdit
FontDialog1.Font. Assign(RichEdit1.SelAttributs)
If (Font. Dialog1.Execute) Then RichEdit1.SelAttributs. Assign(FontGialog1.Font)
Для того что бы форматировать нужно использовать свойства RichEdit параграф …если заняться выравнивания текста, то мы должны использовать под свойство
Alignment – выравнивания текста и принимает следующие значения …
1)taliftrustiby
2)taCenter
3)taPightHistily
Numbering-флаги, что типа такого 1!
1)NsNone
2)NsBullet
Значения под свойство параграф можете изменять только в момент изменения!!
ДИАЛОГИ ПОИСКА {/////}
ДИПЛОГИ С ПОЛЬЗОВАЛЕМ
FindDialog, ReplaceDialog-у этих общий родительский класс, по этому для удобство можно вести глобальную переменную типа TfindDialog (в которую будет записываться указатель на FindDialog1 или ReplaceDialog1(изменить ))….у всех этих вызов Execute …
SPOS –определяет позицию курсора в окне RichEdit…..
Обработчик событий найти и заменить!!
Procedure TForm1.BFintTat. Clec(///)
Begin
Sposs:=RichEdit1.SetStart;
If (Sender as Button)=BFindText
Then Dialog:=FindDialog1
Else Dialog:=ReplaceDialog1
With dialog do
Begin
FindText:=RichEdit1.SelText;
Execute ///end; end;
Если в RichEdit1 текст не выделен ….поместили 2 диалоговых окна …и 2 кнопки!!!
Для того чтоб в диалоговых областях найти и заменить, нужно выделить на форме FindDialog1 …
Procedure TForm1.BFindDialog1.Find(Sender:Tobject);
Var Оpt:TSearchTypes(-определяет параметры поиска и замены)
Begin
With dialog do
Begin
If stMatchCase in Options
Then Opt:=Opt+[stMatch. case]
If stWholeWord in Options;
Then Opt:=Opt+[stWholeWord]….
Spos:=RichEdit1.FinfText
(FindText, Spos, Length(RichEdit1.lines. Text),opt);
FindText-это метод является свойством в объекте диалог
If spos>=0 then
Begin
RichEdit1.Setstart:=Spos;
RichEdit1.SelLength:=length(FindText)
Inc(Spos);
If (Dialog=RepLaceDialog1)
And (ftReplaceAse in Options )
Begin then ReplaceDialog1.Replase(Sender);end;
Else
Begin
ShowMessogs(‘Поиск завершён’+FindText+’ ’+’не найден’);
CloseDialog;
End;
End;
Richedit1.SetFocus; end;
Обработчик событий заменить или создадим выполнил следующие операции …
Выделяем …что то там тыкнем и запишем …
Procedure Tform1PeplaceDialog1.Replece(sender:Tobject);
Begin
If RichEdit1.SelText<>’’
Then RichEdit1.SetText:=ReplaceDialog1.ReplaceText;
Если установлен флаг то удалить все!!!
If frReplaceAll in ReplaceDialog1.Options
Then
findDialog1.Find(Sender)
осталось написать 2 обработчика события от нажатия клавиш или нажатия мыши …выделяем RichEdit и щелкаем в заготовку обработчика вставить оператор определяющий позицию курсора в RichEdit…
срока Spos:=onMaus это для мыши …
Записи и списки
Записи обьявля-ся так же как и в Pascale
Самоадресубщая запись
first
Рассмотрим варианты линейного списка :
*очередь каждый новый эл. Добав-ся в хвост. Эл. Из такой очереди извл-ся из головы списка
FirctIFirstOut
Для работы с очередью, обычно созд-см нескол, казателелей , на голову на хвост (Tail)Можно ввести текущий.
-Дековая структура (вст-ть не в голову, а в текущий )
-Стек
Пример Use : преобраз-я в исчисл-ии каждый эл-т вст-ся в голову и извл-ся из головы
LastInFirstOut
Для работы со стеком иметь метод вталкивания push в голову списка. Нужно знать операцию извлег-я из списка pop, а также просматривать сод-е в голову списка peek
Обьекты класса TList
Прежний способ работы со списком, отд-е созд — е типов противоречит инкапсуляции ООП. Поэтому в Delphi создан специальный класс в методе Classes, кот-ый преды-м для хранения, укр-я списком указателей на любые обьекты (pointer)
Со-ва и методы класса Tlist позв-ют :
*создать любого типа список
*добав-ть
*удалять
*Сортировать
В приложении обьекты класса Tlist создается вызовом его конструктора
1 Описать обьект
2 Инициол-ть
1 Мlist: Tlist
В onCreatForm создать:
Мlist:= Tlist. Create;
А как удалить?
Мlist. Free;
Создается в обработчике события исп-ем ondestroy список
Зам-е: обьект это список истипизиров-х указ-ей …
Нетипиз-е указа-ли на эл. Списка хранятся в динамическом массиве и для доступа к эл. исп-ся св-ва items класса Tlist..Заголовок :
Property Items (Index:integer):pointer;
Для обра-я к эл.(исп-я его данных ) указатель нужно преобразовать к след. Типу нужно помнить, что счет начинается с 0 (нуля)
Сво-во Items это св-во умолч-ю. Мlist. Items[2]-обращаемся к 3-ему эл.
Мlist[2] , обо способа возможны
Если обращение к эл. Вне списка (индекс больше чем размер списка ), то в этом случа-е дофм-ся исключения ElistError
Для изм-я указателей в списке исп-ся сво-во count, это со-во дея-ст:
1) возрв-ть текущие число указатели с списке ;
2) может изм-ть это число.
n:= Mlist. Count; {кол-во указ-ей в списке}
Мlist. Count :=Mlist. Count-3;
Если добавим, толавые эле. Nil
Для анализа кл-во эл. Списке можно исп-ть CapaCity, кот-ое наказыв-ет общ. Кол-во в списке и в отлич. 0 и равных 0
При увели-ии числа эл-тов, когда оно начинает привышать CapaCity, оно увели-ся с запасом равлом 3м
Со-во CapaCity имеет смысла зад-ть сколько эл. С списке, такое зад-е ускоряет вып-е приложения
При удалении эл. , автоматически уменьшается значение count но значени-е CapaCity остаётся неизмен …
Можно и МList. CapaCity:=MList. Count если ув-ть не будем больше
Метод Expand
Этом метод также может увел-ть обьем списка при count = CapaCity в др. случае этой метод не расширяет список
· Если CapaCity<4,то Expand увеличивает список на 4 эл. Expand без параметров.
· Если 4<список<9 то на 8
· Если список >8, то на 16
Причем
Function Expand :Tlist
(ук-ль на расма-ый список )часто исп-ся для созда-я дубликата имеющеюся
Mlist1:MlistExpond
Для работы с классом Tlist нужно изучить
Для работы с обьектами класса Tlist нужны методы
1.Класс Tlist непосредственный потомок TObject, след-но все методы на слетаются
Специф-е
Метод |
Описание |
Add |
Function Add(item:pointer):integer Добавл-ет эл. В сущ список возв-ет порядковый номер |
Clear |
Очищает список |
Delete |
Удаляет 1 эл. По индексу |
Exchange |
Процедура перестановки 2х эл. В списке |
First |
Ф-я возв-ет указатель на голову списка |
IndexOf |
Ф-я в-ет индекс первого вхожд-я список указате-ля, исходя из этого возв-ет число услого типа Если нет, то -1 |
Insert |
Вставляет указатель в указную позицию |
Last |
|
Move |
Процедура изм-ет позицию эл-та в списке |
remove |
Удаляет 1_е вхождение эл. В списке |
Sort |
Имеет параметр процедурного типа |
Создать процедуру тип, множество типа
TlistSortCompare=function(Items1,Items2:pointer):integer
Procedure Sort(compore :TlistSortCompore )
Compare должен возв-ть отриц-ое число если Item1 раньше Item2 полож-е любое в противном равны 0
Расмотрим применение методов класса Tlist …Создадим приложение в котором хранится инф-я о студентах
Тип очеди;
Тип стека;
Создадим тип записи, кот-е будут хранить данные о студентах
Type {созд-ть тип-ый указать на эл. Списка}
TPstud=^TStud;{TStud –тип записи }
TStud=record
Fam, Name, Otch:String[20];
Year:integer;{combobox календарь}
Groop:string[15];
formTich:Boolean;
end;
В прил-им созд-м перем-ый типа записи и типа указателей
Var
MList:Tlist;
PStud:TPStud;
Для создания списка нужно вызвать конструктор create в классе OnCreate формы : инициализация обьекта Mlist
Mlist:=Tlist. Create;(создания пустого списка)
Для заполнения пустого списка нужно создать компалиту +добавл-е к списку сохр-е списка загрузку списка
Обработчик события кнопки «Запомнить»
{оси часть}
Nev(PStud); {выд-е память под узел, если что сделать исключение для памяти, если ее нехватает With PStud^ do
Begin
Fam:=InputBox(‘Введите ’,’Фамилию ’…)
Year:=strtoint(InputBox(//////))}
Узел готов, встав-ем его в список дав-е нав-ого эл.
Mlist. Add(PStud);{очередь}
Создать радиогруппу, в кот-ой выборы тпиа списка, в зависимости от его добавляет нужное
Фу-ция Add увели-т count на 1 и возв-ет Номер вставляемого
Можно в любую точку вставлять с помощью Insert. Все дали эл. Будут сдвинуты на 1 вниз …
RichEdit1.Lines. add(Tpstud(Mlist[i]))
TpStud(MList[i])^.поле
Удаление эл. из списка, весь списка
Для удал-я эл-та
MList. Delete(i);-удаляет из списка указатель, а память не освобождена
Значит до этого нужно отчистить память :
Dispose(Mlist[i]);
А потом удалить указатель что произходит с count и CopyCity
Тоже самое и для удаления всего списка + несколько методов сортировки
Сортировка по 1 ому из поелй
Фамилия
Метод sort умеет параметр процедурного типа. Значит нам нужно его дописать передаем в метод сортировки 2 указателя и этот метод возвращает целое положение знач-е, если 1 ый эл. Больше второго, -1 ,если 1-ый меньше и 0 если равны
Function compYear (Item1,Item2:pointer):integer;
Ver
Begin
If Tpstud(Item1)^ year>
Tpstud(Item2)^.year
Then Result:=1;
Else
If Tpstud(Item1)^ year<
Tpstud(Item2)^.year
Then Result:=-1;
Else Result:=0;
End;
Mlist. Sort(Comp. Year(1,2,))
Списки и строки
Tstrings. TsringList
Эти классы используют-ся для работы со строками, в частности метол Add и сво-во Lines Memo, Rich и т. д яв-ся св-вами класса Tstrings
Однако созд-ть обьект класса не можем, он абстрактный для него хор-но :Исп-е его св-в. Класс TstringList ;…..
{заполнения списко строк }
{обращения к эл. Строки }
Slist. Strings[i];
Исп-ся:count – сколько строк сейчас
Text
CapaCity – возможное количество строк
Св-во text сод-т все строки ввиде одной строки с раз-ем, но можно выбрать отд-ую строку …
Objects-позволяет обратиться к эл. Списка
Самим выписать методы какие то там!!!