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

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

  Все выпуски  

Программирование на DELPHI v3-7 Выпуск нумер 27


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

"В сортире лучше быть юзером, чем админом..."


Выпуск № 27

Здравствуйте, уважаемые подписчики!


Скоро наступит очень важный праздник. Думаю не надо рассказывать какой?
Слышу гром аплодисментов, свидетельствующий что все догадались, о каком празднике идет речь.
Абсолютно верно, это ОН, праздник когда все мужчины вспоминают период, готовности носить своих избранниц на руках. А наиболее романтичные натуры, от ностальгии переходят к делу и дарят своим "спутницам" цветы, и даже моют в этот день посуду, после употребления продуктов приготовленных накануне, угадайте кем... Согласитесь после Нового Года, это второй по значимости праздник, на территории пост-советского пространства.
А заговорил о нем я так заранее, не спроста, т.к. на носу выходные, а потом праздники, и запоздай я еще на один день, многие увидят эту рассылку 9 марта. А как-же заряд бодрости перед праздниками?? Тото-же.
И так. Милые наши женщины - примите мои пожелания, которые и перечислить сложно, (надо открывать отдельную рассылку), но главное это быть счастливой, внутри в этом слове заложены все те мелочи которые и делают жизнь прекрасной. Ну и отдельно выражу восхищение Вами, а особенно тем что Вы интересуетесь программированием, (а как показывают письма таких не мало). Причем как показывает мой опыт многие мужчины подписываются на такие рассылки впрок, т.к. собираются с "понедельника" начать программировать. А вот представить себе женщину с такими мотивами - не могу :)
Смотрю мужчины погрустнели - а зря, на Вас задача повышенной трудности, поздравить Ваших женщин. Быть женой программиста это не легкая задача. Постарайтесь в эти несколько дней компенсировать им тот недостаток внимания который они возможно недополучили.

Изучение Ваших писем, показывает что многим интересна тема работы с INI файлами. А тем кто думает что ему это не надо - сейчас попробую доказать обратное.
И так Вы написали программу. Она отлажена, работает и даже не глючит. Отлично! Но Вы не задумывались сколько в мире клонов, одних и тех же программ?? Да я одних только "Блокнотов" пересмотрел штук сто, а всяких альтернатив "проводнику"... И ведь дело не только в том что выживают те программы которые напичканы максимальным набором функций, разве что кофе в постель не подают. А еще и в так называемой "Юзабельности" простите меня за это словечко, просто слово удобство не в полной мере передает смысл. Т.к. программу именно "Юзают", то есть "используют", а просклонять это слово - язык не поворачивается.
К чему я веду? А к тому, что каждый человек индивидуален, он хочет что-бы эта программа открывалась именно в определенном месте монитора, т.е. там где он ее прошлый раз закрыл. А еще возможно его раздражает что он всегда открывает в ней файлы из одной и той же папки, а она этого не помнит, и необходимо постоянно пробираться через дебри "проводника". И еще сотни и сотни мелочей.
Вот для того чтобы сохранять а в последствии загружать эти "мелочи" и нужны ini-файлы. Мое мнение "Это должно быть в каждой программе имеющей интерфейс пользователя." Тем более что пользоваться этим не просто, а гениально - просто! И так, немного теории:

Подключение к ini-файлу (для чтения, записи или создания)
IniFile:=TIniFile.Create('Имя_Файла.ini');

Чтение из файла осуществляется так:
переменная:=IniFile.Read****(Раздел, Параметр , значение_по_умолчанию);
где, **** - надо заменить тем типом данных которые вы собираетесь читать. т.е. ReadString, ReadBool, ReadFloat, ReadDate, ReadTime, ReadDateTime.
А что такое "Раздел, Параметр" - поймете дальше.

Запись - аналогично:
IniFile.Write****(Раздел, Параметр, значение_по_умолчанию);

И после чтения/записи надо выполнять команду:
IniFile.Free
Теоретически этого можно и не делать, но будут глюки, похоже связанные с тем что система чтобы лишний раз не дергать винт (какая забота), кэширует записи "на потом".

А теперь рабочий пример.
Создаем новый проект. В свойствах формы переходим на закладку "Events" т.е. "События" и два раза кликаем по событию OnCreate, после чего услужливый Delphi создаст процедуру
procedure TForm1.FormCreate(Sender: TObject);
Внутри которой пишем: LoadIni;
Аналогично делаем с событием OnClose, в котором прописываем SaveIni;
Т.е. мы указали что при запуске программы будет выполняться процедура LoadIni, а при закрытии? Правильно SaveIni. - Ну полдела сделано, осталось написать эти две процедуры ;)
Но перед этим проделаем еще две вещи, во первых вытащим на нашу форму компонент Edit, у меня ему по умолчанию присвоилось имя Edit1 - здесь будем хранить тот путь который якобы нужен пользователю. По умолчанию предложим ему "C:\".
А вторым пунктом - надо прописать в вашей программе, в разделе uses еще один модуль: IniFiles. Именно он будет делать всю черную работу.
Дальше, больше. Собственно наши две процедуры:

procedure SaveIni;
var
IniFile:TIniFile;
begin
IniFile:=TIniFile.Create('MyProg.ini');
IniFile.WriteInteger('Size', 'Width', Form1.Width);
IniFile.WriteInteger('Size', 'Height', Form1.Height);
IniFile.WriteInteger('Size', 'Top', Form1.Top);
IniFile.WriteInteger('Size', 'Left', Form1.Left);
IniFile.WriteString('Data', 'Path', Form1.Edit1.Text);
IniFile.Free;
end;

procedure LoadIni;
var
IniFile:TIniFile;
begin
IniFile:=TiniFile.Create('MyProg.ini');
Form1.Width:=IniFile.ReadInteger('Size', 'Width', 400);
Form1.Height:=IniFile.ReadInteger('Size', 'Height', 200);
Form1.Top:=IniFile.ReadInteger('Size', 'Top', 0);
Form1.Left:=IniFile.ReadInteger('Size', 'Left', 0);
Form1.Edit1.Text:=IniFile.ReadString('Data', 'Path', 'C:\');
IniFile.Free;
end;


Вот собственно и все. Теперь сохраните проект, и запустите приложение. Окно разместится в верхнем левом углу, будет иметь размер 400 на 200 и в поле Edit1 будет указан путь C:\ - это все так называемые параметры по умолчанию. Т.к. ini файла еще не существовало.
Попробуйте переместить окно, изменить его размер и ввести другой путь. А затем закройте. Теперь снова запустите - Вуаля! Окно имеет тот вид в котором было до закрытия. Что и требовалось доказать.

Теперь самым выносливым вторая порция теории. Вам наверное интересно где-же наш файл 'MyProg.ini' - а он в папке Windows (или WinNT - для NT-систем) среди сотен таких же собратьев. Вы наверно разочарованы таким расположением, логичнее было бы его разместить в папке самой программы. НО есть программы которые запускаются с CD-ROM'а - и такая логичность, для них вылезет боком. Но если Вы уверены что Вашу программы минет сия участь, то замените строчки IniFile:=TiniFile.Create('MyProg.ini'); на следующую:
IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));
Кроме того файл будет называться также как и Ваша программа. Согласитесь это красиво.

Кстати, не пора ли заглянуть в этот магический файл. Вот его содержание:

[Size]
Width=400
Height=200
Top=0
Left=0
[Data]
Path=C:\

Это сразу проливает свет на загадку в начале выпуска, по поводу того что такое "Раздел, Параметр".
Параметр - это что-то типа внешней переменной в которой будем хранить наше значение. А Раздел - это скорее сервисная возможность, для удобства можно разбивать переменные на тематические группы. Это и красивее и понятнее и позволяет использовать одно имя переменной в разных разделах - фантазия ведь не резиновая, столько имен придумывать. :)

Ну и немного вернемся к прошлым выпускам.
Давиденко А. В. напомнил мне что есть более элегантные методы печати на принтер, которые позволяют ставить документы в очередь печати и мирно сосуществовать нескольким программам одновременно. Но есть у такого способа один минус нужны драйвера принтера и надо знать точное название принтера в данной системе - а это отдельная задача. Впрочем, код приведу:

procedure PrintText( AText: String );
type
TMyJobInfo = Record
ji: ADDJOB_INFO_1;
buf: array[0..255] of Char;
end;
var
hPrinter: THandle;
ji: TMyJobInfo;
dw: DWORD;
fs: TFileStream;
begin
if ( not OpenPrinter( PChar( PrinterName ), hPrinter, nil ) ) then
// PrinterName - переменная, хранящая название принтера
begin
Msg( 'Не удалось инициализировать принтер ' + PrinterName, mtError, [ mbOk ] );
Exit;
end;
try
CharToOEMBuff( PChar( AText ), PChar( AText ), Length( AText ) );

AddJob( hPrinter, 1, @ji, sizeof( ji ), dw );

fs := TFileStream.Create( ji.ji.Path, fmOpenWrite or fmCreate );
try
fs.Write( PChar( AText )^, Length( AText ) );
finally
fs.Free();
end;

ScheduleJob( hPrinter, ji.ji.JobId );
finally
ClosePrinter( hPrinter );
end;
end;


К сожалению никто, не помог с вопросом по поводу включения/отключения сетевой карты, но думаю еще не вечер. И отдельно хочу поблагодарить тех кто прислал ответы на вопрос Елены по поводу кодировок в базе данных, ответы пересланы ей, но на будешее, если есть e-mail лучше писать сразу автору вопроса. И пусть Вас не смущает адрес типа "vasya сАбака mail.ru" надеюсь понятно что это аналог vasya@mail.ru, но слегка сбивает столку роботов-спамеров.
Сегодня у нас вопрос еще от одной Елены:

Вопрос (delphi 7). в свойствах (properties) формы(form) или програмным путем можно присвоить любую иконку (icon), которая отображается при работающей программе. но ярлык да и сам ехе-шник сохраняют вид стандартного вида Делфи. как поменять этот значок? вручную конечно можно поменять вид ярлыка, но это не по нашему. И можно ли в качестве ico использовать bmp-шный рисунок?
Ответить: Elena

Дополнительно хочу предоставить Вам возможность бесплатно сделать себе (своей даме) хороший подарок. Я договорился с КДА (это владелец сайта 1001 сказка) и теперь, если вы подпишетесь на его дополнительную рассылку, вы получите возможность скачать две интересные программы:

Salon Styler Pro - программа для компьютерного подбора причесок. В комплект входит каталог на несколько тысяч причесок, как женских, так и мужских и детских. Кстати, производитель просит за программу почти тысячу долларов, а вам она достанется бесплатно.

"Виртуальный стилист" - компьютерный подбор причесок, макияжа и аксессуаров (очков, шляп и т.д.). Основное отличие от предыдущей в том, что программа полностью русифицирована.

Как получить ссылки на эти программы? Достаточно написать письмо, и в течении 2-3 дней вы получите гарантированно живые ссылки. Предупреждаю - вы автоматически подписываетесь на еще одну рассылку, но если она вам не понравится, то процедура отписывания очень проста (будет изложена в письме.)

Кроме того автор постоянно выкладывает аудиокниги и прочие вкусности на ФТП, а в рассылке, дает на них ссылки (каламбур-с) :). Вообщем интересного немало - рекомендую, сам подписан.

Пожалуй на сегодня достаточно.
Еще раз всех с праздниками!

Оставайтесь с нами.
/Tisa


Написать письмо.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.programondelphi
Отписаться

В избранное