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

Интернет для Delphi-программиста


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

Интернет для Delphi программиста.

Выпуск : № 24 


Здравствуйте уважаемые подписчики рассылки "Интернет для Delphi программиста". Данная рассылка предназначена для всех кого интересует Delphi, здесь будут выкладываться ссылки на различные ресурсы интернета так или иначе связанные с Delphi: книги, исходники, программы... Изучайте Delphi один из лучших языков программирования!!!


ЗАДАТЬ ВОПРОС :

Правила рассылки: 
1. Не присылайте ответов на вопросы типа "да, нет".  
2. Если отвечаешь на вопрос - то отвечай подробно с примерами (желательно с исходником примера).
3. Тема вопросов - программирование на Delphi.
Внимание авторам: - Я не указываю ваши адреса из-за спама, но кто хочет, чтобы его email был - пишите, иначе только имя.
Отправить вопрос


Новые вопросы.


Вопрос № 40 задаёт: Дмитрий Ответить
У меня вопрос!Как можно построить график в делфи, задавая его формулу не в исходнике, а именно в поле запущенной программы?
Вопрос № 41 задаёт: Артем Ответить
Очень нужно - как выполнить поиск по документу Word и выдрать найденные строки целыми абзацами желательно с простым форматированием куда-нибудь, хоть в RichEdit или WebBrowser. Смысл похож на поиск слова подобно yandexу.
Вопрос № 42 задаёт: Nikan Ответить
Привет Всем!
Помогите, пожалуйста, разобраться!
Есть Memo, в которое загружаю текст (список людей с порядковыми номерами, среди которых есть несколько с однаковыми - 888). Нужно из этого текста вирезать всё и оставить только те строки, которые начитаються с 888. А потом из каждой такой строки вырезать фамилию, имя, отчество и сделать DBF с такими же полями.???
Может кто знает как это сделать, помогите?
Вопрос № 43 задаёт: webmail Ответить
Здравствуйте, где можно найти исходник почтовой программы для получения почты, с сохранением аттачмента письма в определенной папке, или у кого может есть, прошу поделится. webmail#mail.kz

Ответы.

Вопрос № 36 задаёт: Ярошук Юрий Ответить
Подскажите как из TMemo передать в Excel с полным оформлением по (столбикам и строкам)
Отвечает: turusov
Могу предложить один из модулей передачи текстовой информации в Excel.
С помощью этого юнита также можно передавать данные в файл и на принтер.
Для передачи данных в Excel по ячейкам используются строки в которых данные разделены символами табулции.

Для получения дополнительных сведениях о используемых модулях,
перейдите по ссылке http://www.nstur.narod.ru/Delphi/index.html
Там есть описания работы с данными для передачи в Excel.

{
Модуль вывода данных в файл, принтер или Excel. Версия 1.3
Для изменения фонта используйте Printer.Canvas.Font
}
unit NsPrint;

interface

uses SysUtils, Forms, Printers, NsExcel2000;

resourcestring
hcErrNsPrint = 'Ошибка записи в файл: ';
hcErrNsFile = 'Не могу создать файл: ';
hcErrOutFile = 'Ошибка вывода в файл.';
hcErrExcel = 'Ошибка вывода в Excel.';

type
TNs_out = (outFile, outPrn, outLPT2, outLPT3, outExcel);
TNs_frm = (frmDos, frmWin);

var
NsPrint_out: TNs_out;
NsPrint_frm: TNs_frm;
NsPrint_FileName: TFileName;
//const
NsPrintOpen: boolean = False;

procedure OpenPrint(outValue: TNs_out;
const frmValue: TNs_frm;
AFileName: TFileName);
function WritePrint(const strTemp: string; CRLF: boolean = True): boolean;
procedure ClosePrint;
var
PrintExcel: TNsExcel2000;
implementation

uses NsLibrary, Dialogs, Windows;

var
FPrint: System.TextFile;
PrintText: System.Text;
ExcelRow: integer;

procedure OpenPrint(outValue: TNs_out;
const frmValue: TNs_frm;
AFileName: TFileName);
var
TempStr: string;
begin
if NsPrintOpen then ClosePrint;
{}
NsPrint_out:= outValue;
NsPrint_frm:= frmValue;
NsPrint_FileName:= AFileName;
{}
case outValue of
outFile: begin
TempStr:= NsPrint_FileName;
if Length(DelSpace(NsPrint_FileName)) = 0 then Exit;
end;
outPrn: TempStr:= 'LPT1';
outLPT2: TempStr:= 'LPT2';
outLPT3: TempStr:= 'LPT3';
outExcel: TempStr:= '';
else
Exit;
end;{case}

if (NsPrint_out = outExcel) then begin
PrintExcel:= TNsExcel2000.Create(Nil);
PrintExcel.NewWorkbook('');
PrintExcel.PutStr(1,1,NsPrint_FileName);
ExcelRow:= 2;
NsPrintOpen:= True;
end
else
if (NsPrint_out = outPrn) AND
(NsPrint_frm = frmWin) then begin
try
AssignPrn(PrintText);
Rewrite(PrintText);
NsPrintOpen:= True;
except
on E:EPrinter do begin
MessageBox(Application.Handle, PChar(hcErrNsPrint+TempStr+StrMessage(E.Message)),
'Ошибка', MB_OK OR MB_ICONERROR);
Exit;
end;//on
end;//try
end
else begin
Assign(FPrint, TempStr);
{$I-}
Rewrite(FPrint);
{$I+}
if IOResult <> 0 then begin
MessageBox(Application.Handle, PChar(hcErrNsFile+NsPrint_FileName), 'Ошибка',
MB_OK OR MB_ICONERROR);
Exit;
end;
NsPrintOpen:= True;
end;{else}
end;{OpenPrint}

function WritePrint(const strTemp: string; CRLF: boolean = True): boolean;
var
TempStr: string;
NsLL: TNsLL;
k: integer;
begin
if NOT NsPrintOpen then begin
Result:= False;
Exit;
end;
{}
if (NsPrint_out = outExcel) then begin
if PrintExcel.Connected then begin
try
NsLL:= TNsLL.CreateSeparator(#9);
NsLL.Text:= strTemp;
try
for k:= 1 to NsLL.Count do
if NOT PrintExcel.PutStr(ExcelRow, k, NsLL.GetStr(k-1))
then Exit;
inc(ExcelRow);
except
on E:Exception do begin
ClosePrint;
MessageBox(Application.Handle, PChar(hcErrExcel), 'Ошибка',
MB_OK OR MB_ICONERROR);
end;
end;//try
finally
NsLL.Free;
end;//try
end;
end
else
if (NsPrint_out = outPrn) AND
(NsPrint_frm = frmWin) then begin
if CRLF then Writeln(PrintText, strTemp)
else Write(PrintText, strTemp);
// Writeln(PrintText, strTemp);
end
else begin
if NsPrint_frm = frmDos then begin
TempStr:= strTemp;
TransWinToDos(TempStr);
end
else
TempStr:= strTemp;
{$I-}
if CRLF then Writeln(FPrint, TempStr)
else Write(FPrint, TempStr);
{$I+}
if IOResult <> 0 then begin
MessageBox(Application.Handle, PChar(hcErrOutFile), 'Ошибка',
MB_OK OR MB_ICONERROR);
if NsPrintOpen then ClosePrint;
Result:= False;
Exit;
end;
end;{else}
Result:= True;
end;{WritePrint}

procedure ClosePrint;
begin
if NsPrintOpen then begin
NsPrintOpen:= False;
if (NsPrint_out = outExcel) then begin
PrintExcel.Free;
end
else
if (NsPrint_out = outPrn) AND
(NsPrint_frm = frmWin) then begin
System.Close(PrintText);
end
else begin
{$I-}
if NsPrint_out <> outFile then
WritePrint(#12,True);
CloseFile(FPrint);
{$I+}
if IOResult <> 0 then;
end;{else}
end;//if
end;

end.

Вопрос № 37 задаёт: Eugene Ответить
Надо сделать прогу-тест. У меня на форме несколько RadioButton'ов и Кнопка. Дан вопрос и 4 варианта ответов - один из них правильный ответ, 3 соотв. непр. (4 RadioButton'ов). Как сделать, чтобы когда я выбираю один из RadioButton'ов(правильный) и кликаю по кнопке, должно выйти сообщение "Правильно". Подскажите, как это осуществить?
Отвечает: Дохлый Лорд
Не понял, в чём проблема?? Если ты знаешь, что радиобаттон правильный, то выводи showmessage, на лейбел и т.д. сообщение.
Если проблема в определении правильности, то это зависит от реализации: если вопросы и ответы лежат в файле, то можно пометить правильный ответ и запомнить его при выводе вариантов, но нечестные люди запасут фичу =))
Можно расположить правильные и неправильные ответы по определённому алгоритму... В обчем, вариантов-туча, всё зависит от реализации, потребностей и т.д.
Отвечает: Alexsander www.sassoft.narod.ru
Это просто:
procedure TForm1.Button1Click(Sender: TObject);
begin
If (RadioButton1.checked=true) then ShowMessage('Правильно!') else ShowMessage(Неправильно!);
end;
Отвечает: Сорокин Глеб
Можно сделать так:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 2 then Application.MessageBox('Правильно','Msg')
else Application.MessageBox('Не Правильно','Msg')
end;

или так:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: begin Application.MessageBox('Не правильно','Msg') end;
1: begin Application.MessageBox('Не правильно','Msg') end;
2: begin Application.MessageBox('правильно','Msg') end;
3: begin Application.MessageBox('Не правильно','Msg') end;
end;
end;

Отвечает: Spider
Это легко. :)
При нажатии на кнопку поставьте следующий код:
If RadioButton1.Checked = True
then
ShowMessage('Ответ правильный')
else
ShowMessage('Ответ неправильный');

Где RadioButton1 - компонент с правильным ответом.

Отвечает: Vadim
Есть вариант на Вижуал бейсике если хош могу прислать.
Отвечает: vadim5000
Пользуйся RadioGroup. Добавь 4 пункта в Items, а потом читай его свойство ItemIndex (-1 или от 0 до 3). В начале ItemIndex равен -1 -не выбрано ничего.
Вопрос № 38 задаёт: Ирина Ответить
Здравствуйте! Как из одной ТБД в CompoBox высветить 2 поля и как их по выбору перенести в DBGrid (т.е. делаем выборку из справочника, высветив 2 его поля (наименование, цена) и заносим выбранные данные в формируемую БД)?
Отвечает: SHKoder
используй нужные, правильные компоненты ориентированные на БД и тогда у тебя не будет таких головняков, потому советую DevExpress
Отвечает: Сергей
Соответственно, именно это строковое поле мы и показываем в качестве LookUpFields.
В таком случае в обработчике OnCalcFields нужно использовать что-то типа:
with MyLookUpQuery do
FieldByName('MyCalcField').AsString:=FieldByName('Name').AsString + ', ' +
FieldByName('Price').AsString;
end;

Можно также использовать библиотеку компонентов DevExpress Quantum Grid 5.0 - она позволяет в своих LookUpComboBox'ах выводить несколько колонок.

2. Занести значения в Grid намного проще. У Grid'а есть свой источник данных - либо запрос, либо таблица. Теперь, когда мы выбрали нужное значение из списка, можно назначать обработчик. Это уже по усмотрению - либо по нажатию кнопки, либо OnCloseUp для списка, либо OnChange для списка. В общем, должно произойти примерно следующее - мы запихиваем в определенные поля Запроса (Таблицы) нужные нам значения:
with GRIDQuery do begin
Edit;
FieldByName('Name').AsString:=MyLookUpQuery.FieldByName('Name').AsString;
FieldByName('Price').AsFloat:=MyLookUpQuery.FieldByName('Price').AsFloat;
Post; // Можно запостить, можно не постить - тут по усмотрению
end;

Стоит помнить, что сия процедура будет происходить именно с той записью в Grid'е, на которой в данный момент стоит курсор.
Надеюсь, что объяснил более-менее нормально. Удачи.

Вопрос № 39 задаёт: GOG Ответить
Всем приветы!!!
У меня тут нехилая задачка.
Вообщем так, имеется программа, которая была сделана на дедушке всех компьютеров ZX-Spectrum с интерпритатором Бейсика. Она полностью рабочая была на том компе.
Я хочу перенести ее в мой современный, но есть одно НО. В программе участок не реализуемый стандартными средствами в Delphi и VisualBasic.
Его задача, дать готовый результат вычисления, которое находится в символьной переменной. В оригинале это реализовывалось с помощью функции VAL(), аналог в Delphi и VisualBasic работает по иному, и возможности адаптировать его нет. Что делать?
Отвечает: SHKoder
inttostr(), floattostr(), PChar, variant()
почитай про функции и все встанет на свои места
Отвечает: mail.ru
Береш TPLex и TPYacc (или OLex и OYacc) и пишеш свой интерпретатор формул.
Калькулятор на Yacc-е это тривиальная задача и в документации есть пример её решения.
TPYacc это однопоточная библиотека.
OYacc объектная и соответственно можно встроить в программу много интерпретаторов работающих параллельно.


Статья:   Алгоритмы Сортировки часть 2. Автор: Delist. Сайт: http://www.noil.pri.ee/
Это вторая часть статьи, посвященная алгоритмам сортировки. Если вы пропустили первую, то её можно найти на моём сайте, перейдя по этой ссылке. В этой же части я продолжу объяснения о существует ныне методах сортировки, а также попробую рассказать о других примерах, которые хотя и не являются алгоритмами сортировки, но тесно связаны с этой темой, и возможно, они вам пригодиться когда вы столкнётесь с решением реальной задачи.

Думаю, что начать надо сразу.

Сортировка слиянием

Сортировка слиянием - этот рекурсивный алгоритм. Он, также как и быстрая сортировка(описано в первой части), делит список на две части, и затем рекурсивно вызывает сам себя для их дальнейшего упорядочивания. Она делит список на две равные части, после чего подсписки рекурсивно сортируются и сливаются для того что бы образовать полностью отсортированный список.

Процесс объединения, наверно, наиболее интересная часть алгоритма и её понять, довольно, не сложно. Подсписки объединяются в рабочий массив, а результат копируется в исходный список. Однако, следует учитывать что при сортировки слишком большого массива могут возникнуть проблемы с составлением рабочего массива. Из-за большого числа сортируемых элементов, программа может обращаться к файлу подкачки что снижает её скорость, также пагубно влияет на время копирования данных из одного массива в другой. Но время выполнения можно увеличить, если применять в связку сортировкой слиянием с другой сортировкой, например с сортировкой вставками. Для этого необходимо выбрать некоторое число элементов массива при достижении которого рекурсия будет остановлена и массив будет досортирован другим методом. Это можно сделать примерно так:

if (max-min)B> then begin
  SelctionSort(a, min, max);
  exit;
  end;


StopIndex - это и есть то число которое Вы выбрали для остановки рекурсии.Сам алгоритм в чистом виде выглядит так

procedure MergeSort(var ar1, ar2: array of Integer; min, max: Integer);
var
  middle, int1, int2, int3: Integer;
begin
if minB> then begin //в противном случае массив состоит
  //из 1-го элемента и упорядочен.
  middle:=min div 2+max div 2;
  // рекурсивно сортируем подсписки
  MergeSort(ar1, ar2, min, middle);
  MergeSort(ar1, ar2, middle+1, max);

  int1:=min; //указатель на 1-й массив
  int2:=middle+1;  //указатель на 2-й массив
  int3:=min; //указатель на объединённый массив

  //объединение сортированных массивов
  while (int1<=middle) and (int2<=max) do begin
    if ar1[int1]B> then begin
      ar2[int3]:=ar1[int1];
      int1:=int1+1;
      end
    else begin
      ar2[int3]:=ar1[int2];
      int2:=int2+1;
      end;
    inc(int3);
    end;
  // очистка не пустого списка
  while (int1<=middle) do begin
    ar2[int3]:=ar1[int1];
    int1:=int1+1;
    int3:=int3+1;
    end;
  while (int2<=middle) do begin
    ar2[int3]:=ar1[int2];
    int2:=int2+1;
    int3:=int3+1;
    end;
  end;
//приравнивание входящих массивов
for int1:=min to max do
  ar1[int1]:=ar2[int1];
end;


Этот алгоритм работает обычно медленней, чем быстрая сортировка, однако у него есть ряд преимуществ: во первых он показывает стабильные результаты при сортировке определённого количества данных, в то время как при быстрой сортировке эти результаты могут довольно сильно различаться(см табл). Во-вторых, при большом количестве повторяющихся элементов программа не уходит в глубокую рекурсию.

Результата сравнения сортировки слиянием быстрой сортировкой приведены в таблице. Для тестов использовался компьютер с процессором Pentium-133, 16-Ram. Количество сортируемых элементов равнялось 1млн.

Диапазон значений Время сортировки слиянием (сек) Время быстрой сортировки(сек)
1-10млн 4.72 2,75
1-1000 4.67 16.12
1-100 4.75 194.18


Сортировка подсчётом

Сортировка подсчётом - специализированный алгоритм, который работает невероятно быстро, если элементами массива являются целые числа, со значениями, которые занимают, относительно узкий диапазон(диапазон значений должен быть сравним с длинной массива). Пока выполняются эти условия алгоритм работает отлично. Для примера можно привести результат сортировки 1-го миллиона элементов со значением от 1-10000, на том же компьютере с процессором Pentium-133. Время быстрой сортировки было равно 3,93 секунды, результат же сортировки подсчётом был 0,37секунды, то есть быстрее в 10 раз.

Большая скорость выполнения достигает за счёт того, что в алгоритме не используются операции сравнения. Без них алгоритм сортировки может упорядочивать значения за время равное O(N).

Исходный текст алгоритма подсчётом, довольно, короткий и кажется простым, в действительности он очень тонок.

procedure CountiongSort(var ar: array of integer; min, max: integer);
var
  counter: array[0..100000] of integer;
  i, j, index: Integer;
begin
// заполняем массив нулями
for i:=0 to high(counter) do tmpA[i]:=0;
for i:=min to max do begin
  counter[ar[i]]:=counter[ar[i]]+1;
  end;
// устанавливаем значение в правильную позицию
index:=min;
for i:=min to high(counter)-1 do begin
  for j:=0 to counter[i]-1 do begin
    ar[index]:=i;
    index:=index+1;
    end;
  end;
end;


Давайте попробуем его рассмотреть. Вначале создаётся массив для подсчёта элементов имеющих определённое значение, и устанавливает все значения равными нулю. Затем алгоритм вычисляет сколько раз в списке встречается каждый элемент и увеличивает значение соответствующей записи счётчика на 1. Или иными словами, при исследовании элемента массива под номером i программа увеличивает значение counter[ar[i]].И конце, алгоритм проходит через весь массив счётчиков, помещая определённое число элементов в отсортированный массив. Для каждого значения i от 1 до N он добавляет counter[i] элементов со значением i.

Сортировка шейкером

Сортировка шейкером, чаще всего, применяется для упорядочивания очень больших массивов, которые возможно находятся на жёстком диске. Этот алгоритм за один проход цикла выбирает наибольший и наименьший алгоритм и помещает их соответственно в начало и конец списка. Затем операция повторяется и сортируются остальные элементы. Таким образом для сортировки всего массива понадобиться N\2 проходов цикла.
Код алгоритма должен выглядеть примерно так:

procedure ShakerSort(var ar: array of integer; min, max: Integer);
var
  n, i, j, tmp: Integer;
begin
n:=max;
for i:=1 to (n div 2) do begin
  if ar[i]>ar[i+1] then begin
    min:=i+1;
    max:=i;
    end
  else begin
    min:=i;
    max:=i+1;
    end;
  for j:=i+2 to (n-i+1) do
    if ar[j]>ar[Max] then
      max:=j
    else if ar[j]B> then
      min:=j;
    //end; else if
  // end; for
  {Обмен элементов}
  tmp:=ar[i];
  ar[i]:=ar[min];
  ar[min]:=tmp;
  if max=i then
    max:=min;
  //end; if
  tmp:=ar[n-i+1];
  ar[n-i+1]:=ar[max];
  ar[max]:=tmp;
  end;
end;


Краткие Выводы

Перед тем как перейти ко второй части статьи хочу сделать общий вывод изученного материала. Мы с вами рассмотрели восемь различных способов сортировки данных и я думаю, что это достаточный багаж знаний. Возможно, кто-то спросит, а зачем писать сложные алгоритмы, если есть сортировка вставками, которая реализуется всего в пару строк и в её работе всё понятно. Да, в чём то он будет прав, для сортировки не больших массивов алгоритм сортировки вставками подходит не плохо, но если массив будет состоять из миллиона элементов и вы запустите его сортироваться методом вставок, то компьютер надолго задумается. Поэтому всегда надо отдавать себе отчёт в том какая из сортировок наиболее желательна в конкретном случае. И для того что бы Вам было легче решить какой именно метод использовать, я хочу привести такую таблицу.

Алгоритм Преимущества Недостатки
Сортировка Выбором Очень прост,
Быстро сортирует небольшие списки
Медленно работает с большими списками
Сортировка вставками Очень прост,
Быстро сортирует небольшие списки
Очень медленно работает с большими списками
Пузырьковая сортировка Быстро работает для почти отсортированных списков Медленно работает в остальных случаях
Быстрая сортировка Быстро сортирует большие списки Работает некорректно при большом количестве одинаковых значений
Метод Шелла Сортирует дробные числа Требует пространства памяти для хранения временных значений
Сортировка слиянием Быстро сортирует большие списки Работает медленнее, чем быстрая сортировка
Сортировка подсчётом Очень быстро работает, если разброс входных значений не велик Медленно работает в случае если разброс составляет >log(N)
Сортировка Шейкером Сортирует данные на жёстком диске Работает медленнее, чем быстрая сортировка


На этом мы закончим рассмотрение самих алгоритмов сортировки и перейдём к другим примерам связанным с этой темой.

Перемешивание

Сейчас рассмотрим обратный сортировке процесс, а именно перемешивание. Это значит что из упорядоченного состояния мы будем переводить данные в неупорядоченные. Сам алгоритм довольно прост, но всё же кратко расскажу о принципе его действия.

Для каждой позиции списка алгоритм случайным образом выбирает элемент. При этом рассматриваются элементы из ещё не помещённых на своё место. Затем выбранный элемент меняется местами со стоящим в этой позиции элементом. При этом не имеет значения был ли список отсортирован самого начала или нет. Программы всё равно перемешает элементы списка.

Сам код выглядит так:

procedure RandomizeArray(var ar: array of integer; min,
  max: Integer);
var
  i, range, pos, tmp: Integer;
begin
range:=max-min+1;
Randomize;
for i:=min to max-1 do begin
  pos:=min+random(range);
  tmp:=ar[pos];
  ar[pos]:=ar[i];
  ar[i]:=tmp;
  end;
end;


Сортировка строк

Если вы внимательно посмотрите на код представленных сортировок, то заметите, что для некоторых из них не имеет значение какие данные сортировать. Итак в такими сортировками являются: сортировка вставками, выбором, пузырьковая сортировка, быстрая сортировка, сортировка слиянием и сортировка шейкером. Возьмём для примера быструю сортировку и переделаем ей для упорядочивания строк, при это никакого значения играть не будет какую раскладку вы используете.
То что получилось у меня вы можете увидеть ниже.

procedure QuickSort(var a: array of string; min, max: Integer);
Var
  i,j: integer;
  mid, tmp: string;
Begin
if minB> then begin{массив из одного элемента тривиально упорядочен}
  mid:=A[min];
  i:=min-1;
  j:=max+1;
  while i<j do begin
    repeat
      i:=i+1;
      until A[i]>=mid;
    repeat
      j:=j-1;
      until A[j]<=mid;
    if iB> then begin
      tmp:=A[i];
      A[i]:=A[j];
      A[j]:=tmp;
      end;
    end;
  QuickSort(a, min,j);
  QuickSort(a, j+1,max);
 end;
end;


Поиск в отсортированном массиве

Когда необходимо найти произвольный элемент в массиве самое первое что приходит на ум это перебрать все значения массива и сравнить их с искомым. Однако применять этот метод для поиска в отсортированном массиве значит не рационально использовать ресурсы компьютера. Для отсортированных массивов лучше применять двоичный поиск. Его идея заключается в следующем сравнить искомый элемент с элементом в серединой массива, если искомый элемент меньше элемента в середине массива, то подобным же образом исследовать первую половину массива, если больше - то вторую, если равен - то возвращается его индекс. Лучше всего понять всё вышесказанное, взглянув на рисунок. На нём показан процесс нахождения числа 44.



Сам код алгоритма двоичного поиска выглядит так:

function BinarySearch(find: Integer; ar: array of integer; min,
  max: integer): Longint;
var
  middle: Longint;
  searches: Integer;
begin
searches:=0;
while (min<=max) do begin
  searches:=searches+1;
  middle:=round((min+max)/2);
  if find=ar[middle] then begin
    Result:=middle+1;
    exit;
    end
  else if findB> then
    // исследуем- левую половину массива
    max:=middle-1
  else
    // исследуем правую половину массива
    min:=middle+1;
  end;
  // искомого элемента не оказалось в списке
  Result:=0;
end;


Заключение

На этом думаю поставить точку. Как всегда, свои замечание по прочитанной статьи вы можете оставить на форуме. Если что-то не получилось скачать исходник можно здесь

Удачи.
Компаненты:   

Компоненты DelphiX

Наверно, лучший на сегодняшний день пакет для работы с графикой и звуком.Изменённая версия поддержки DirectX в Delphi. Пакет позволяет прорисовывать сложные сцены на мониторе тормозов, как это было бы в случае использования Canvas.
На сайте выложена версия пакета для Delphi7

Библиотека компонентов RXLib

RX Library - это библиотека компонент и функций для Borland Delphi и Borland C++ Builder, включающая исходные тексты всех модулей, демонстрационные примеры и файл справки, подключаемый к справочной системе Delphi. Библиотека RX является бесплатным свободно распространяемым (freeware) продуктом. Это означает, что вы можете свободно распространять библиотеку в оригинальном виде, без изменения исходных текстов модулей и содержимого инсталляционного архива.
На сайте выложена версия библиотеки для Delphi7  для  Delphi6


Справочник:   

WinAPI Справочник

Этот хелп пpедставляет собой кpаткий спpавочник для пpогpаммистов, котоpым тpебуется конкpетная инфоpмация по той или иной возможности интеpфейса API. Функции и пpоцедуpы Windows пеpечисляются и описываются в алфавитном поpядке.

Для каждой пpоцедуpы или функции пpиводится следующая инфоpмация: заголовок пpоцедуpы или функции , описание каждого паpаметpа, возвpащаемое значение и кpаткое описание выполняемого функцией действия.

Сейчас описано 728 функций и процедур, 27 видов констант,72 структуры, множество сообщений и несколько примеров.

Курс уроков по Delphi

Данный справочник, практически является полноценной книгой и идеален для тех кто только, хочет научиться хорошо программировать В Delphi. Мне нравиться,что в этой книге авторы не стали объяснять много трудной и занудной теории, а начали с самого интересного и важного.


Исходники:   

Игра Шашки

Игра отличается хорошей графикой, но искусственный интеллект весьма прост. Если комп может быть то бьет, если не может то ищет такой ход, при котором не будет жертвования, если не находит, то жертвует. При ходе без жертвования, выбирается шашка ближе к центру, при жертвовании наоборот - дальше от центра, это позволяет с большим успехом разменяться а не просто жертвовать.
Для компиляции необходим DelphiX

Игра Авторалли

В программе существует возможность редактирования трасс, система жизней, подсчета очков, сохранения, открытия созданных трасс. Игра имеет довольно хорошую графику.
Для компиляции необходим DelphiX. Его скачать можно здесь.

Игра в дурака

Игровая программа, представленная в данной работе, является разновидностью карточных игр и называется: «Подкидной дурак»
Для нормальной компиляции проекта необходимы пакеты компонентов DelphiX и Rxlib. Скачать их можно в разделе Компоненты: RxLib и DelphiX


Проги:  

Мне попалась интересная программа написанная на Delphi но без исходников может кому нужно :)

LCP 5.04 размер: 2.8 мб.
http://www.lcpsoft.com/download/lcp504ru.exe

LCP 5.04 - предназначена для выполнения аудита и восстановления паролей пользователей операционных систем Windows NT/2000/XP/2003. Основные возможности программы: 

  • импорт информации об учетных записях пользователей
  • импорт с локального компьютера
  • импорт с удаленного компьютера 
  • импорт файла SAM
  • импорт .LC-файла,.LCS-файла 
  • импорт PwDump-файла 
  • импорт Sniff-файла 
  • восстановление паролей атакой по словарю, гибридом атаки по словарю и последовательного перебора, атакой последовательным перебором
  • разбиение последовательного перебора на части
  • вычисление LM- и NT-хэшей по паролю 
  • вычисление LM- и NT-ответов по паролю и запросу сервера

Интересные и полезные сайты по Delphi: 

http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компаненты, пообщаться на форуме.


Немного юмора:  :))

Директору пивзавода от группы программистов. 
Заявление. 
Просим Вас предоставить выделенную линию со скоростью 0,512 л/сек.


Чем технология клиент/сервер напоминает подростковый секс: 
1. Это все время у всех на уме. 
2. Все только и говорят об этом. 
3. Каждому кажется, что остальные занимаются этим. 
4. Те немногие, кто все-таки делают: 
а) делают это плохо; 
б) уверены, что в следующий раз у них получится лучше; 
в) не заботятся о безопасности.


- Сколько программистов нужно, чтобы сменить перегоревшую лампочку? 
- Ни одного. Это Hardware Problem. 


"Программирование" - как и "любовь" - одно слово, за которым скрывается бесконечное множество занятий. 


- Можно ли загадать желание, если сидишь между двумя программистами? 
- Можно! Только глючить будет. 


Игра "О счастливчик". 
Игрок - Прошу убрать два неверных варианта. 
Ведущий - Итак, дорогой компьютер, уберите пожалуйста два неверных варианта. 
Надпись на мониторах - "Программа выполнила недопустимую ошибку и будет закрыта". 
Ведущий - Что ж по просьбе компании Microsoft - реклама.... 


Фирма Microsoft выпустила "Windows for woman" Основное отличие продукта в том, что две кнопки - "Yes" и "No" заменены одной - "Maybe..." 


Дружественная рассылка:

Рассылки Subscribe.Ru
Программирование на Delphi.
Всё о Delphi



Все кто хочет изучить Delphi и реально научиться писать свои программы, ЦПИ "Эверест" поможет Вам.
Всё, что Вам нужно это компьютер и доступ к интернету - для получения уроков.

10 причин в пользу платного обучения в ЦПИ "Эверест"…

1. Когда Вы платите деньги- появляется дополнительный стимул против лени: надо учиться, ведь деньги уже уплачены….
2. Учась платно, получаете удобный для Вас график работы.
3. Весь необходимый справочный материал Вы получите в свое время и на русском языке.
4. Используя интернет в качестве бесплатной библиотеки, Вы получаете все ее минусы:

  • трата времени на поиск необходимого материала (а это потерянные деньги и время). А у Вас есть лишние время и деньги?;
  • отсутствие гарантии, что Вы "осилите" данный материал, ведь пишут его, в основном, не педагоги- профессионалы, а программисты- профессионалы, а они пишут для таких же, как они. А Вы программист- профессионал?
  • отсутствие системности в скачиваемом материале (ведь человек, писавший для Вас материал, не знает, чем Вы владеете). А Вы обладаете системой знаний по Delphi?;

5. Стоимость обучения одного месяца в ЦПИ "Эверест" сравнима с ценой хорошей книги. Но часто ли Вам попадались книги, рассчитанные именно на Вас. Мы же работаем индивидуально.
6. Автор книги или магазин не несет никакой ответственности за то, поняли ли Вы материал или нет, мы же закрепляем за каждым курсантом преподавателя, курирующего Вас.
7. Освоив программирование в Delphi - Вы освоите:

  • основы настоящего программирования- структурного и процедурного программирования ;
  • систему работы с базами данных и SQL- запросами, а это одно из самых перспективных направлений в программировании;
  • язык программирования ObjectPascal, что позволит Вам легко перейти, при желании, на С или Паскаль;
  • работу с компьютерной графикой;
  • при желании - основы низкоуровневого программирования ( Ассемблер).

8. А это значит, что …Мы предлагаем получить "высшее образование" - профессию программиста всего за 1 год и 144 доллара, любой ВУЗ попросит в 3 раза больше за один только семестр.
9. Вы получаете самый практический курс в сети, поскольку теория дается только тогда, когда она действительно необходима…
10. Учиться у нас легко и просто. Весь материал доступен и простым людям, не имеющим никогда дел с программированием….


По всем вопросам обращайтесь ко мне.

Если вы встретили в интернете интересный сайт или статью, да и вообще, что угодно связанное с Delphi, поделитесь ссылкой.
Если можете написать статью связанную с Delphi - присылайте с радостью выложу.
Давайте поможем друг другу!  Архив рассылки.

Предложения, критику и пожелания пишите на e-mail.


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiinternet
Отписаться
Вспомнить пароль

В избранное