Sites of the week

ads ads ads ads

Delphi: переводирование KOI8-R в WINDOWS-1251 и обратно.

Posted by admin | Delphi, Кодировки | Вторник 11 Март 2008 15:14

Ниже приведены листинг функци для перекодирования текста из кодировки KOI8-R в кодировку WINDOWS-1251 и листиг функции для перекодирования текста из кодировки WINDOWS-1251 в кодировку KOI8-R.

type
TConvertChars = array [#128..#255] of char;
 
const
Win_KoiChars: TConvertChars = (
#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#060,#139,#140,#141,#142,#143,
#144,#145,#146,#147,#148,#169,#150,#151,#152,#153,#154,#062,#176,#157,#183,#159,
#160,#246,#247,#074,#164,#231,#166,#167,#179,#169,#180,#060,#172,#173,#174,#183,
#156,#177,#073,#105,#199,#181,#182,#158,#163,#191,#164,#062,#106,#189,#190,#167,
#225,#226,#247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,#238,#239,#240,
#242,#243,#244,#245,#230,#232,#227,#254,#251,#253,#154,#249,#248,#252,#224,#241,
#193,#194,#215,#199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,#207,#208,
#210,#211,#212,#213,#198,#200,#195,#222,#219,#221,#223,#217,#216,#220,#192,#209);
 
Koi_WinChars: TConvertChars = (
#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,#140,#141,#142,#143,
#144,#145,#146,#147,#148,#149,#150,#151,#152,#153,#218,#155,#176,#157,#183,#159,
#160,#161,#162,#184,#186,#165,#166,#191,#168,#169,#170,#171,#172,#173,#174,#175,
#156,#177,#178,#168,#170,#181,#182,#175,#184,#185,#186,#187,#188,#189,#190,#185,
#254,#224,#225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,#236,#237,#238,
#239,#255,#240,#241,#242,#243,#230,#226,#252,#251,#231,#248,#253,#249,#247,#250,
#222,#192,#193,#214,#196,#197,#212,#195,#213,#200,#201,#202,#203,#204,#205,#206,
#207,#223,#208,#209,#210,#211,#198,#194,#220,#219,#199,#216,#221,#217,#215,#218);
 
function Win_KoiConvert(const St: string): string;
var
i: integer;
begin
Result:=St;
for i:=1 to Length(St) do
if St[i]>#127 then
Result[i]:=Win_KoiChars[St[i]];
end;
 
function Koi_WinConvert(const St: string): string;
var
i: integer;
begin
Result:=St;
for i:=1 to Length(St) do
if St[i]>#127 then
Result[i]:=Koi_WinChars[St[i]];
end;

Delphi: IWebBrowser - делаем запрос POST

Posted by admin | ActiveX, IWebBrowser, Internet | Вторник 11 Март 2008 14:59

Пример отправки POST-запроса с помощью компонента IWebBrowser.

 
 
procedure TForm1.PostWithWebBrowser(PostString: string; URL: OleVariant);
var
Data: Pointer;
PostData: OleVariant;
Flags, TargetFrame, Headers: OleVariant;
begin
PostData := VarArrayCreate([0, Length(PostString) - 1], varByte);
Data := VarArrayLock(PostData);
try
Move(PostString[1], Data^, Length(PostString));
finally
VarArrayUnlock(PostData);
end;
Flags := EmptyParam;
TargetFrameName := EmptyParam;
Headers := EmptyParam;
WebBrowser1.Navigate2(URL, Flags, TargetFrame, PostData, Headers);
end;

Delphi: Как узнать свой IP

Posted by admin | Delphi, Internet, Локальная сеть | Вторник 11 Март 2008 11:32

В Uses прописываем модуль WinSock

 
function GetLocalIP:string;
var
WSVer:integer;
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
WSVer:=$101;
if WSAStartup(WSVer, wsaData) = 0 then
begin
if GetHostName(@Buf, 128) = 0 then
begin
P := GetHostByName(@Buf);
if P <> nil then
result:=iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;

Apache 2: Исправляем ошибку 413 Request entity too large

Posted by admin | Apache, Unix | Четверг 6 Март 2008 12:49

Решение ищется просто:

 
Server:#cd /etc/apache2
Server:/etc/apache2# cat apache2.conf |grep Limit
SecRequestBodyLimit 131072
SecRequestBodyInMemoryLimit 131072
SecResponseBodyLimit 524288
Server:/etc/apache2#

Нас интерсует как раз SecRequestBodyLimit, открываем конфигурационный файл Apache2

 
server:/etc/apache2# nano apache2.conf

Выставляем свое значение для SecRequestBodyLimit , к примеру, на класс выше:

 
SecRequestBodyLimit 1310720

Сохраняем файл, перезагружаем Apache2:

 
server:/etc/apache2# /etc/init.d/apache2 restart

Все.

Delphi: Меню в WEB-браузере (IWebBroswer)

Posted by admin | ActiveX, Delphi, Интерфейс | Среда 13 Февраль 2008 16:21

В конференции я часто натыкался на вопросы типа – "Как добавить свой пункт меню в контекстное меню IE, как это делает ReGet", "Как запретить появление контекстного меню в TwebBrowser” или "Как показать свое меню вместо стандартного". А вот ответов в большинстве случаев не было, или они советовали попробовать другие компоненты. Но когда мне самому понадобилось в рамках одного проекта сразу, и запретить появление меню, и вставить свой пункт в стандартное меню IE, я решил покопать в этом направлении. И, конечно, MSDN выручила меня в этих поисках. Так что не бойтесь, меню и TwebBrowser – очень даже дружны между собой и то, что с легкостью делают ребята с ReGet Software, не такая уже и неприступная магия…

далее...

Вывод Hint для ячейки DBGrid

Posted by admin | Delphi, Базы данных, Интерфейс, Контролы | Среда 13 Февраль 2008 01:01

 Как вывести Hint для ячейки DBGrid

Создайте на форме DataSource1, Table1, DataSource2, Table2, DBGrid1. Table1 и Table2 свяжите со своей базой данных. DataSource1 и DataSource2 свяжите соответственно с Table1 и Table2. DBGrid1 свяжите с DataSource1 Table2 и DataSource2 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них.

далее...

Delphi: CoolTrayIcon - компонент для иконки и оповещений в трее (Sysytem Tray)

Posted by admin | Delphi, Интерфейс, Компоненты | Вторник 5 Февраль 2008 18:29

CoolTrayIcon - компонент, название которого говорит само за себя.
Компонент обладает большим количеством свойств для настройки поведения иконки:

  • различные события щелчка мыши;
  • поддержка меню popup;
  • методы для сокрытия и показа основной формы;
  • сворачивание формы в трей при минимизации;
  • анимация иконки;
  • интерактивные подсказки;
  • конвертация точечных рисунков в иконки;
  • предварительный просмотр при экспериментировании;
  • компонент может использоваться в службе NT;
  • восстанавливает иконку при аварийном завершении Проводника.
  • Включены 7 демо приложений.
  • С исходными текстами.

Домашняя страница: http://subsimple.com/delphi.asp

Delphi: ComboBox в ячейке StringGrid

Posted by admin | Delphi, Интерфейс | Суббота 26 Январь 2008 15:08

 ComboBox в ячейке StringGrid

 
procedure TForm1.FormCreate(Sender: TObject);
begin
{Высоту combobox'а не изменишь, так что вместо combobox'а
будем изменять высоту строки grid'а !}
StringGrid1.DefaultRowHeight := ComboBox1.Height; {Спрятать combobox}
ComboBox1.Visible := False; ComboBox1.Items.Add('Delphi Kingdom');
ComboBox1.Items.Add('Королевство Дельфи');
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False; StringGrid1.SetFocus;
end;
 
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col,
StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible := False; StringGrid1.SetFocus;
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if ((ACol = 3) and (ARow <> 0)) then
begin
{Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1.Left := R.Left + 1;
ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;
ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}
ComboBox1.Visible := True; ComboBox1.SetFocus;
end;
CanSelect := True;
end;

Работа с ini файлами в Delphi

Posted by admin | Delphi, Интерфейс, Файловая система | Среда 23 Январь 2008 05:23

Вообще, ini-файлы – очень удобная вещь. В ini-файл можно записать практически всё, хотя создан он в основном для хранения настроек программы.

Структура ini-файла очень проста: весь файл поделён на секции. В секциях содержатся ключи и эти ключи хранят значения. Вот пример открытого в блокноте ini-файла:
[Form properties]
Width=450
Height=320
Left=10
Top=35
[Application properties]
Dir=C:\Мои документы\Musuc
Date=28.09.02

В этом ини-файле, как мы видим, 2 секции: Form properties и Application properties. В каждой из этих секций есть ключи, содержащие числа, строковые выражения, дату. Запись в файл осуществляется путём указания секции ини-файла, названия ключа и указания самого значения. Ниже я опишу способы использования ини-файла на Borland Delphi.

Для работы с ини-файлами в Delphi существует модуль IniFiles. В нём описан нужный нам класс TIniFile.

1. Включите Delphi и создайте новый проект.

2. Допишите в Uses новый модуль IniFiles.

3. Создайте глобальную переменную класса TIniFile.
var
Form1: TForm1;
IniFile: TIniFile;

4. При создании формы надо инициализировать переменную IniFile:
procedure TForm1.FormCreate(Sender: TObject);
begin
IniFile:=TIniFile.Create('C:\Program files\MyApplication\MyIni.ini');
end;

Инициализация проходит с участием дополнительного параметра типа string. Это имя файла. Если имя введено не полностью, а, например, так: 'MyIni.ini', то файл создастся при записи в папке Windows. Я же рекомендую создавать файл в папке с программой (её можно узнать так: ExtractFilePath(Application.ExeName)).

5. Как осуществить запись в файл? Для записи в ини-файл есть несколько процедур у класса TIniFile - смотря что надо записать.

Процедура записи строки:
WriteString(const Section, Ident, Value: string);

Процедура записи цифры:
WriteInteger(const Section, Ident: string; Value: Longint);

Процедура записи булевого выражения:
WriteBool(const Section, Ident: string; Value: Boolean);

Запись даты:
WriteDate(const Section, Name: string; Value: TDateTime);

Запись время:
WriteTime(const Section, Name: string; Value: TDateTime);

Запись даты и время вместе:
WriteDateTime(const Section, Name: string; Value: TDateTime);

Запись не целого численного значения:
WriteFloat(const Section, Name: string; Value: Double);

Запись потока:
WriteBinaryStream(const Section, Name: string;Value: TStream);

Во всех этих функциях обязательно указывать секцию (Section), имя ключа (Name) и записываемое значение.

Для наглядности вы можете поместить на форму кнопку и по её нажатию можете прописать следующее:
procedure TForm1.Button2Click(Sender: TObject);
begin
IniFile.WriteString('Form info','Form caption',Caption);
IniFile.WriteInteger('Form info','Left',Left);
IniFile.WriteInteger('Form info','Top',Top);
IniFile.WriteInteger('Form info','Width',Width);
IniFile.WriteInteger('Form info','Height',Height);
IniFile.WriteTime('Other','Write time',Time);
end;

По выполнению этого кода программа создаст (если ещё не создан) файл в указанном при процедуре Create месте и запишет в него примерно следующее:
[Form info]
Form caption=Form1
Left=192
Top=107
Width=544
Height=375
[Other]
Write time=23:13:55

6. Процедура чтения из ини-файла осуществляется похожим способом. Для чтения существуют функции:
ReadString(const Section, Ident, Default: string): string;
ReadInteger(const Section, Ident: string; Default: Longint): Longint;
ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
ReadBinaryStream(const Section, Name: string; Value: TStream): Integer;
ReadDate(const Section, Name: string; Default: TDateTime): TDateTime;
ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime;
ReadFloat(const Section, Name: string; Default: Double): Double;
ReadTime(const Section, Name: string; Default: TDateTime): TDateTime;

Каждая функция возвращает прочтённое из файла значение. Если по каким-либо причинам прочтение не удалось, то функция возвращает значение, указанное в параметре самой функции как Default.

Например, для прочтения из нашего ини-файла значения Form caption надо написать следующее:
Edit1.Text:=IniFile.ReadString('Form info',
'Form caption','Ошибка при чтении!');

В этом примере тексту помещённого на форму Edit-а присваивается прочтённое из файла значение. В нашем случае тексту Edit-а будет присвоено значение «Form1». Если чтение не удастся, то тексту Edit-а будет присвоено значение «Ошибка при чтении».

Другие процедуры и функции для работы с ини-файлами:

Проверка, существует ли секция:
function SectionExists(const Section: string): Boolean;

Прочтение всей секции:
procedure ReadSection(const Section: string; Strings: TStrings);

Прочтение всего файла (все секции записываются в Strings):
procedure ReadSections(Strings: TStrings);

Прочтение всех значений в заданной секции:
procedure ReadSectionValues(const Section: string; Strings: TStrings);

Удалить заданную секцию со всеми её значениями:
procedure EraseSection(const Section: string);

Удаление определённого ключа (и его значения) в секции:
procedure DeleteKey(const Section, Ident: String);

Проверка, существует ли заданный ключ в указанной секции:
function ValueExists(const Section, Ident: string): Boolean;

Delphi: Округление дробных чисел

Posted by admin | Delphi, Алгоритмы, Арифметика | Пятница 18 Январь 2008 22:46

Вещественные числа, в отличие от целых чисел, хранят лишь приблизительное значение, и за рубежом используются в основном для хранения научных данных. Для хранения денежных величин обычно используются целочисленные типы данных. Однако integer как правило не хватает для хранения наших денег (особенно остро стоит эта проблема в турции, где зарплату получают миллионами турецких лир). Поэтому для денег приходится использовать вещественные числа (начиная с InterBase 6.0 и в последующих версиях InterBase/Firebird/Yaffil есть поддержка int64 или bigint в третьем диалекте).

далее...

Страница 1 из 812345678»