Воскресенье, 2024-05-19, 7:46 PM
Начало Форум Регистрация Вход
Вы вошли как Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Flaer  
Форум » Любимая УЧЕБА » Программирование!!! » Небольшие уроки, облегчающие жизнь Дельфисту
Небольшие уроки, облегчающие жизнь Дельфисту
FlaerДата: Понедельник, 2006-05-08, 0:51 AM | Сообщение # 1
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Здесь будут выкладыватья описания различных компонентов, методов и уловок, облегчающих написание программ, делающих это занятие более простым и удобным.

Начнем с компонента, с которым я сейчас вплотную вожусь: TIniFile.
Те кто с ним знаком, могут дальше не читать. В принципе те кто незнаком могут почитать help, где все описано подробнее. Мое описание дается исключительно для знакомства.

TIniFile загружает и извлекает специализированную информацию и установочные параметры из INI-файлов.
Если вам надо хранить где-то изменяемые данные, то это самый простой способ.
Вам не придется считывать txt-файл, искать в нем нужное наименование и выделять его значение. Все это сделано за вас.

Структура INI-файла.

Файл состоит из секций внутри которых расположены переменные и их значения. Все названия переменных и секций пишутся с новой строки. В Ini-файле должна быть хотя бы одна секция, для корректной работы.

Для наглядности приведу свой Ini-файл:

Code
;файл может распологаться либо в папке с программой
;либо в папке Windows
[OPTIONS]
autoanaliz=0
newlist=0
lastedited=
[LASTOPEN]
0=C:\Program Files\Borland\Delphi6\Projects\RTF\2\test\AK.rtf
1=C:\Program Files\Borland\Delphi6\Projects\RTF\2\test\alphabit2.rtf
2=C:\Program Files\Borland\Delphi6\Projects\RTF\2\test\alphabit.rtf
3=C:\Program Files\Borland\Delphi6\Projects\RTF\2\test\AK1.rtf

Рассмотрим его составляющие:

Строки в начале которых стоят символы ";" - комментарии.

[OPTIONS] есть название секции.

autoanaliz=0
собственно само название переменой и ее значение. В моем случае 0 означает, что опция автоанализа не включена.

Работа с TIniFile

Приведу опять таки свой код с описанием:

Code
var
  IniF : TIniFile; //объект
begin
  try
    IniF := TIniFile.Create(path_to_ini); //создаем его, path_to_ini - полный путь + имя файла
    //записываем значение mnAutoAnaliz.Checked в булевскую переменную rsAutoAnaliz в секции rsOptions 
    IniF.WriteBool(rsOptions, rsAutoAnaliz, mnAutoAnaliz.Checked);
    IniF.WriteBool(rsOptions, rsnewList, mnNewList.Checked);
    if RTFFile <> nil then begin
//записываем строку
     IniF.WriteString(rsOptions, rsLastEdited, RTFFile.Document.FileName);
     actSubMenu.Execute;
     RTFFile.Destroy;
    end
    else
     IniF.WriteString(rsOptions, rsLastEdited, '');
     
  finally
//в конце обязательно освобождаем занятую память 
    IniF.Free();
  end;

end;

Хочу заметить что работа с TIniFile ведется исключительно через блоки try, чтобы отловить возможные ошибки (т.к. в этих файлах обычно содержится важная информация).
Конечно же из Ini-файла можно читать. Все процедуры имеют такие же названия только в начале стоит Read вместо Write.
Осталось добавить с какими типами он может работать:
Boolean
String
Integer
Float
Date
DateTime
Time
,
 а также BinaryStream, то есть извлечение информации в двоичном виде.

Если есть вопросы по TIniFile задавайте, т.к. с ним еще можно кое-что делать. Как-то: считать сразу всю секцию, проверить существует ли переменная или секция и т.д.
Могу добавить что также существует tRegIniFile для работы с системным реестром. Почти полностью схож с TIniFile.

Вот и все на сегодня. Вернее на завтра, т.к. уже за полночь =)
Всем удачного программинга
А мне еще описание курсовика делать. =)

 
Алин-кааДата: Четверг, 2006-05-18, 9:54 PM | Сообщение # 2
душа форума
Группа: Проверенные
Сообщений: 239
Репутация: 4
Статус: Offline
Quote (Flaer)
А мне еще описание курсовика делать. =)

Ну как???
Сделал?


Иногда шаг вперед – результат хорошего пинка сзади.
 
FlaerДата: Пятница, 2006-05-19, 3:37 PM | Сообщение # 3
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Quote (Алин-каа)
Ну как???
Сделал?

Как же. Это я хелп файл писал. А он не встал сцуко. В смысле не откомпилировался.
Сегодня сделал почти сортировку абзацев. Правда кривенько =) А Салимов не пришел. Вот и сижу в инете.
Описание в субботу вечером буду делать уже как отчет . wacko


Теперь я снова свободен
 
Алин-кааДата: Суббота, 2006-05-20, 9:09 PM | Сообщение # 4
душа форума
Группа: Проверенные
Сообщений: 239
Репутация: 4
Статус: Offline
Quote (Flaer)
А Салимов не пришел

А че это с ним то?
Как у Салимова дела то?


Иногда шаг вперед – результат хорошего пинка сзади.
 
FlaerДата: Воскресенье, 2006-05-21, 3:12 PM | Сообщение # 5
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Quote (Алин-каа)
А че это с ним то?
Как у Салимова дела то?

Дела норм, как всегда. Мучается с нами.
Купил мобилку.


Теперь я снова свободен
 
Алин-кааДата: Суббота, 2006-05-27, 11:15 PM | Сообщение # 6
душа форума
Группа: Проверенные
Сообщений: 239
Репутация: 4
Статус: Offline
Quote (Flaer)
Мучается с нами.
Купил мобилку.

Если бы мучался не взял бы вас!
С вами Салимов мучается, а я с Гусенковым мучаюсь(ну и не только я наверное), неизвестно когда защита,вообще ничего не известно!! cry
А еще фиг знает че поставит!!!Он считает что мы ничем не занимались весь год!!! sad

Добавлено (2006-05-27, 11:15 Pm)
---------------------------------------------
Quote (Flaer)
Купил мобилку.

А разве не было?Или ты новую?


Иногда шаг вперед – результат хорошего пинка сзади.
 
FlaerДата: Суббота, 2006-06-03, 12:08 PM | Сообщение # 7
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Quote (Алин-каа)

А разве не было?Или ты новую?

Неа это Салимов купил.


Теперь я снова свободен
 
Алин-кааДата: Четверг, 2006-06-22, 8:03 PM | Сообщение # 8
душа форума
Группа: Проверенные
Сообщений: 239
Репутация: 4
Статус: Offline
Quote (Flaer)
Неа это Салимов купил.

biggrin
Клево...я думала у него есть...


Иногда шаг вперед – результат хорошего пинка сзади.
 
bratvaДата: Вторник, 2006-11-14, 6:30 AM | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
Flaer!!!!!!!!!!!!!!!!! вообще непонятно о чем ты пишешь! Придумай чё по-проще! И к тебе люди подтянутся! Вот так! Меня безумно интересует вопрос в чем разница между магнитной и электро магнитной индукцией? Это тема!!! Тупо пообщайтесь на эту тему, А я пронаблюдаю!!

Добавлено (2006-11-14, 6:30 Am)
---------------------------------------------
Это, не только Flaer, но и остальные его товарищи реально отзовитесь посчет индукции angry !!!

 
FlaerДата: Среда, 2006-11-15, 12:57 PM | Сообщение # 10
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Quote (bratva)
Flaer!!!!!!!!!!!!!!!!! вообще непонятно о чем ты пишешь! Придумай чё по-проще! И к тебе люди подтянутся! Вот так! Меня безумно интересует вопрос в чем разница между магнитной и электро магнитной индукцией? Это тема!!! Тупо пообщайтесь на эту тему, А я пронаблюдаю!!
Добавлено (2006-11-14, 6:30 Am)
---------------------------------------------
Это, не только Flaer, но и остальные его товарищи реально отзовитесь посчет индукции !!!

А ты кто такой?)
И причем тут ЭМИ в теме про программирование.
Если хочешь обсуждать физику заводи соотв. топик.


Теперь я снова свободен
 
FlaerДата: Среда, 2007-02-07, 1:12 PM | Сообщение # 11
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
Вот небольшие свойства объекта Application, позволяющие ускорить работу с хинтами.
Application.HintPause - задержка перед выводом подсказки на экран;
Application.HintHidePause - время отображения хинта на экране;
Application.HintShortPause - время для отрисовки нового хинта при переходе мыши на новый контрол.

Все параметры - типа integer, указываются в миллисекундах.

Вывод своих подсказок в поле Statusbara:

procedure TfrmMain.DisplayHint(Sender: TObject);
begin
StatusBar1.Panels[0].Text := Application.Hint;
{или так StatusBar1.SimpleText := Application.Hint;
StatusBar1.SimplePanel должно быть true}
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
ShowHint := true;
end;

Скорость вывода подсказок в StatusBar на OnHint неимоверная, при этом обычные подсказки продолжают выводиться так же под контролом.


Теперь я снова свободен
 
FlaerДата: Среда, 2007-08-01, 11:10 AM | Сообщение # 12
кот в сапогах
Группа: Администраторы
Сообщений: 315
Репутация: 6
Статус: Offline
"Быстрые списки или почему Бухараев не любил TList."

TList хранит данные (а вернее указатели на данные) в приватном поле fList: PPointerList.

PPointerList = ^TPointerList;
TPointerList = array[0..MaxListSize - 1] of Pointer;

Т.е. fList - массив неименованных указателей. Быстрый доступ к данным осуществляется засчет того, что все данные хранятся последовательно в единой области памяти. Если происходит удаление эл-та не из конца списка, то вызывается ф-ция Move, которая сдвигает оставшийся хвост на размер этого-эл-та, а именно на 4 байта. Это и плюс и минус TList'а одновременно. Плюс в том, что можно быстро обратиться к памяти по индексу. Теперь представьте, что будет твориться если размер списка порядка 1Млн, и эл-ты тянутся из начала.
Каждый раз осуществляется Move 4Мбайтов памяти. А если надо тянуть по 1000-эл-тов за 20мс? С этим мы столкнулись на работе. Выход был прост, но подходит не для всех случаев. Переписанного кода едва набралось на 10 строк, но скорость работы со списком возросла в 3 раза!!! (В тестах показатели затраченного времени были вообще нулевые.) Теперь собственно решение:
Вместо Extarct(First), как это было раньше, сделали :

p := Items[Count-1];
Delete(Count-1);

Count - невычисляемая переменная, поэтому времени не ест.
Items[Index] - свойство TList'а, которое при обращение на чтение делает это:
Result := FList^[Index]; поскольку в TList'е все эл-ты хранятся в одном месте, это простое обращение к памяти.
Delete(Count-1) - поскольку удаляется последний эл-т, делает это:
Dec(FCount); т.е. всего навсего уменьшает значение переменной.

Теперь, когда этот способ нельзя применять:
Когда по логике необходимо брать эл-ты из начала списка и списки огромные. Тут придется вспомнить дядю Бухараева и его TStack.

Еще интересная вещь в TList, процедура Grow, которая занимается перевыделением памяти под список:

procedure TList.Grow;
var
Delta: Integer;
begin
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;
SetCapacity(FCapacity + Delta);
end;

Видно, что если размер (в байтах) списка больше чем 64, приращение памяти за один раз происходит на 25%. Покуда всё. cool

 
Форум » Любимая УЧЕБА » Программирование!!! » Небольшие уроки, облегчающие жизнь Дельфисту
  • Страница 1 из 1
  • 1
Поиск: