Все ленты — последние статьи

# Заметки о Delphi

****

Вначале карьеры писал на Delphi, и это было прекрасно (для того времени)! Потом писал на схожей по функциональности платформе Oracle Forms, для околобанковского сектора и не только. Могу с уверенностью сказать — для создания бизнес приложений Oracle Forms лучше Delphi, благодаря прозрачной работе с БД

****

var
S, S2 : String;
P1 : Integer;
begin
//Строка.
S := Edit1.Text;
//Искомая подстрока.
S2 := Edit2.Text;
//Удаление всех вхождений заданной подстроки с учётом регистра букв.
S := StringReplace(S, S2, '', [rfReplaceAll]);
//Или:
//Удаление всех вхождений заданной подстроки без учёта регистра букв.
S := StringReplace(S, S2, '', [rfReplaceAll, rfIgnoreCase]);
//Или:
//Удаление только первого воходения подстроки без учёта регистра букв.
S := StringReplace(S, S2, '', [rfIgnoreCase]);

 

****

 

procedure TForm1.Button2Click(Sender: TObject);
varDoc:IHTMLDocument2;S:string;
beginWebBrowser1.Navigate('URL');
while
WebBrowser1.ReadyState<READYSTATE_COMPLETE do begin
Application.ProcessMessages;
end;Doc:= WebBrowser1.Document as IHTMLDocument2;
s:=doc.body.innerHTML;
Memo1.Text:=s;
end;

*****

 

procedure Ping(IP: String; OutMemo:TMemo);
const BUFSIZE = 2000;
var SecAttr : TSecurityAttributes;
hReadPipe,
hWritePipe : THandle;
StartupInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer : Pchar;
WaitReason,
BytesRead : DWord;
begin
with SecAttr do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
Buffer := AllocMem(BUFSIZE + 1);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.hStdOutput := hWritePipe;
StartupInfo.hStdInput := hReadPipe;
StartupInfo.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar('ping.exe '+IP),
@SecAttr,
@SecAttr,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then
begin
repeat
WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (WaitReason <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
OutMemo.Text := OutMemo.text + String(Buffer);
until (BytesRead < BUFSIZE);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
Процедура отправляет IP адрес и возвращает в TMemo результат работы.
Вот пример использования:
Ping('127.0.0.1', Memo1);

****

Вот таким образом можно осуществить быстрый поиск в ListBox
Код Delphi
123 ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));

****

ListBox1.Items.LoadFromFile(‘название Файла’); загрузка из файла;
ListBox1.Items.SaveToFile(‘название Файла’); сохранение в файл;
Для добавления строки в конец списка можно использовать команду
ListBox1.Items.Add(‘Новая Строка’);
Для добавления строки перед строкой n используется команда
ListBox1.Items.Insert(n, ‘Новая_Строка’); новая строка получает номер n.
Для получения выделенной строки используется команда
Vst:=ListBox1.Items[ListBox1.ItemIndex]; где Vst — текст выделенной строки
Для удаления строки используется команда
ListBox1.Items.Delete(i); где i — номер строки

***

ISAPI, MySQL и DataSnap XE2. http://www.webdelphi.ru

 

 

Сегодня картинок тоже будет не мало. В продолжение темы «Windows 7 x64, IIS, ISAPI и DataSnap XE2 в картинках» решил я поработать с базой данных. Получать от сервера ReverseString, конечно, весело («Оно работает!», «Уау!» и всё такое прочее), но на деле врядли кому-то такой сервер пригодиться. Поэтому решил расширить свой кругозор и доработать уже имеющийся ISAPI-модуль и клиента, чтобы они смогли обмениваться данными — сервер будет читать данные из базы данных и отправлять их клиенту. Клиент, в свою очередь, будет получать данные с сервера, работать с ними и отправлять изменения на сервер.

Подробнее: ISAPI, MySQL и DataSnap XE2. http://www.webdelphi.ru

Delphi. Обмен данными между Excel и MySQL. http://www.webdelphi.ru/

 

Данные таблиц Microsoft Excel достаточно часто используются для формирования небольших по объему, но достаточно информативных баз данных. И как бы не старались разработчики, программисты, менеджеры внедрить новый продвинутый программный продукт (даже бесплатный) в рабочий процесс, довольно часто всё остается на своих местах. Не знаю как Вам, уважаемые читатели, а мне за почти пять лет работы на предприятии приходилось очень часто иметь дело именно с такими микро-БД будь то табличный отчёт по работе отдела или данные мониторинга прилегающих к предприятию территорий, включающий в себя не только таблицы на тысячи строк, но и графики, диаграммы, расчёты и т.д. Я не могу сказать, что такой метод предоставления данных (в Excel) не верный, напротив, данные предоставленые в Microsoft Excel или альтернативном OpenOffice информативны и понятны, а если добавить в предоставление данных диаграммы, то такому отчёту вообще цены нет. Но, акк бы красиво не выглядели небольшие БД в Excel, а если предприятию нужна централизованная обработка и хранение данных, то одним Excel тут врядли обойдешься, особенно, если предприятие крупное. Буквально неделю назад наблюдал картину, как сотрудник отдела промышленной безопасности со смиренным видом ручками передавал данные с листа Excel в базу MySQL. Скопировал чиселку, открыл программку-клиент, вставил чиселку, нажал «Отправить» и так до посинения. Бред? По-моему, полнейший. Так и с ума сойти не долго. Но я слава Богу в том отделе не работаю и навязывать свою точку зрения на счёт такой работы не стал. Пусть себе копипастят на здоровье. Однако вопрос этот засел в голове на долго: каким образом можно автоматизировать передачу данных из Excel в базу данных MySQL? И ответ на этот вопрос нашелся.

Подробнее: Delphi. Обмен данными между Excel и MySQL. http://www.webdelphi.ru/

Репликация Firebird — replication of Firebird databases

 От автора http://krayny.ru:   Вопрос очень интересный, но наверно программы что ниже не подойдут по синхронизации баз. Сам думаю над другим совственный программый решением. Есть три базы: А(таблица 1,2,3)- расположение в интернет, доступ всеми юзерами и базы В(таблица1,2) и С(таблица3) которые дополняют базу А из других источников. Вся проблема в таблицах поля ID — уникальным записям. которые могут не совпадать при добавлении в базу А с другими базами В, С. Предварительно вижу решение, создания дополнительной таблицы в базе А, с ходом и логом синхронизации на котором будут ID всех баз источник и получатель, дата обновления, имя таблицы первоисточника. Второй вариант создание в базе А, в каждой таблице доп. поля с ID номером соотвествия из другой базы (например В). С новыми записями понятно, а вот актуальностью самих записей которые редактировались, думаю тут только решение — отдельные поля по датам обновления, либо что-то то похожее на контрольную сумму всей строки чтоб засекать измения.  Делать несколько этапную синхронизацию. как практически реализую думаю, если не будет лень выложу в отдельную статью.   Профессорских статей в интернет много, но кратких и практических мало, нужно смотреть как это будет работать у самого )). думаю, перенесу этот вопрос http://krayny.ru/delphi/zametki/650-replikaya-sinkhronizatsiya-baz.html  "Репликация синхронизация баз Firebird, пути решения".


Firebird does not offer replication out-of-the-box, you need to use some 3rd party tools. Those external tools add specific triggers that log all the changes in database and replicate to other databases. Here are some tools:

IBReplicator — commercial, cross-platform, full-featured
http://www.ibphoenix.com/products/software/ibreplicator

FiBRE — open source, cross-platform
http://fibre.sourceforge.net/

FBReplicator — open source
http://www.meta.com.au

Подробнее: Репликация Firebird — replication of Firebird databases

MySQL DELPHI API

     Пользователь имеет максимальный размер буфера связи. Размер буфера, который распределен первоначально (16 килобайт), автоматически увеличивается до максимального размера (максимум 16 мегабайт). Поскольку размеры буфера растут только по запросу, просто увеличивая заданное по умолчанию максимальное ограничение, Вы не заставите большее количество ресурсов использоваться. Эта проверка размера обычно применяется в сложных ситуациях.

Буфер связи должен быть достаточно большим, чтобы хранить одиночную инструкцию SQL (для трафика "клиент-на сервер") и одну строку возвращенных данных (для трафика "сервер-на-клиент"). Буфер связи каждого потока будет динамически расширен до максимального ограничения, чтобы обработать любой запрос или строку. Например, если Вы имеете значения BLOB, которые содержат до 16M данных, Вы должны иметь ограничение буфера связи по крайней мере в 16M (на клиенте и на сервере сразу). Заданный по умолчанию максимум пользователя равен 16M, но заданный по умолчанию максимум сервера равен всего 1M. Вы можете увеличивать это, меняя значение параметра max_allowed_packet при запуске сервера.

Сервер MySQL сокращает каждый буфер связи до net_buffer_length байт после каждого запроса. Для клиентуры размер буфера, связанного с подключением, не будет уменьшен, пока подключение не будет закрыто.

Подробнее: MySQL DELPHI API