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

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


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

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

Выпуск : № 56


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


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

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


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


Вопрос № 139 задаёт: Константин Завальный Ответить 

Здраствуйте! Подскажите, пожалуйста, как можно сделать окно непрямоугольной формы (например, такую как в Медиаплеере)?
Читал статью - ничего не понял :
Статья "Создание непрямоугольных форм в Дельфи".
В принцепе, я написал функцию - она работает, но я не совсем понимаю как.

Вопрос № 140 задаёт: illuha_y Ответить 
Ниже привежу кусок кода. Проблема с функцией RegEnumValue, возвращает ошибку
259. Подскажите вчем тут проблема?
procedure TForm1.SkanKey(HKey_: HKEY; KeyStr, Name: string;
  var Value: TRegKeyInfo;var Alist:TStringList);
var
  key: HKEY;
  i,j,d:integer;
  CountKey,LenKey,NumVal: word;
  KeyName,ValueName, st: string;
  Mem: TMemoryStream;
  RegType: byte;
  SizeData: integer;
  len: DWORD;
  MaxData: integer;
//  LenValue: DWORD;
begin
  FillChar(value, SizeOf(TRegKeyInfo), 0);
  ErrorCode:= RegOpenKeyEx(Hkey_,PChar(name) , 0, KEY_READ, Key);
  if ErrorCode <> ERROR_SUCCESS then
    Alist.Add('[RegOpenKeyEx ERROR № '+IntToStr(ErrorCode)+'] ' + name)
  else try
    ErrorCode:= RegQueryInfoKey(key,nil,nil,nil,@Value.NumSubKeys,
      @Value.MaxSubKeyLen,nil,@Value.NumValues,@Value.MaxValueLen,
      @Value.MaxDataLen,nil,nil);
    if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then
     with value do begin
      inc(MaxSubKeyLen,MaxSubKeyLen);
      inc(MaxValueLen,MaxValueLen);
     end;
    mem:= TMemoryStream.Create;
    try
     mem.SetSize(value.MaxDataLen);
     Len:= value.MaxValueLen+1;
     MaxData:= value.MaxDataLen;
     if value.NumValues > 0 then
     for j:= 1 to value.NumValues do begin
      ErrorCode:= RegEnumValue(HKey_,j,PChar(ValueName),Len,0,@RegType,
           mem.Memory, @MaxData);
      if ErrorCode <> ERROR_SUCCESS then Break;
     end;
    finally
     mem.Free;
    end;
  finally
   RegCloseKey(key);
  end;

Ответы.

Вопрос № 135 задаёт: Роман  Ответить
Программа в цикле производит некоторый порядок действий, чтобы не было 100% загрузки процессора я уменьшаю приоритет приложения и добавляю в тело цикла проверку на время одной тиерации:
if (Windows.GetTickCount - StartTime) < Iteration_Time then
  begin
    Application.ProcessMessages;
    Sleep(ABS(Iteration_Time - (Windows.GetTickCount - StartTime)));
    Application.ProcessMessages;
  end;
В итоге получается, что процессор то 100% занят, то свободен ... есть ли более изящное решение проблемы 100% загрузки процессора?
Отвечает: Mail  
Здесть приведён пример процедуры которая запускает программу 1С в режиме конфигуратора и ожидает конец её выполнения, (после поисков вариантов остановился на этом решении, были и другие, с 100% загрузкой процессора самой процедурой и пр.)
procedure TPass.ChangeBitBtnClick(Sender: TObject);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  res: BOOL;
  f : Textfile;
  cmdLine :String;
  ExitCode: Cardinal;
  dw :   DWORD;
begin


  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);

  if Pass1C.Text<>'' Then
    cmdLine := Path1C.Text+' config /d'+LocalDir.Text+' /n'+User1C.Text+' /p'+Pass1C.Text+' /@'+LocalDir.Text+'\CP\UnLoad.ini'
  else
    cmdLine := Path1C.Text+' config /d'+LocalDir.Text+' /n'+User1C.Text+' /@'+LocalDir.Text+'\CP\UnLoad.ini';

  res:= CreateProcess(nil,
                PChar(cmdLine),
                nil,//PChar('/d'+LocalDir.Text+'/n'+User1C.Text+'/p'+Pass1C..Text),
                nil,
                False,
                0,
                nil,
                nil,
                si,
                pi);

  if res then
   begin
    Application.Minimize;
    WaitForSingleObject(pi.hProcess, INFINITE);
    //dw := GetLastError();
    Application.Restore;
   end;
 end;
Вопрос № 136 задаёт: Nikan  Ответить
Скажите, пожалуйста, как из определённого текста, который, например, загружен в Memo удалить все повторяющиеся строки. То есть, есть текст с фамилиями людей, нужно, чтобы в названии фамилий не было повторов!
Отвечает: Евгений http://decoding.narod.ru 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
begin
   for i := Memo1.Lines.Count-1 downto 0 do
      for j := i-1 downto 0 do
         if Memo1.Lines.Strings[i] = Memo1.Lines.Strings[j] then
         begin
            Memo1.Lines.Delete( i );
            Break;
         end;
end;
Вопрос № 138 задаёт: Vlad  Ответить
Как програмно ввести логин и пароль ( и перейти на следующую страничку) в страничка з таким html кодом:
<!-- UTM template: classic. File: aaa_login.tpl. Copyright (C) 2002,2003 NetUP -->
<HTML>

<HEAD>
<TITLE>Вход в UTM</TITLE>

</HEAD>

<BODY marginheight=10 marginwidth=10 leftmargin=10 topmargin=10 vlink=#551A8B link=#0000EE text=#000000 bgcolor=#FFFFFF>

<TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD bgcolor=#43AA2E><TABLE width=100% cellspacing=1 cellpadding=0 border=0>
<TR><TD bgcolor=#E0EED3 colspan=2><TABLE width=100% cellspacing=5 cellpadding=0 border=0>
<TR><TD align=left valign=middle><TABLE cellspacing=0 cellpadding=0 border=0><TR><TD align=left><FONT face="Tahoma,Arial,Helvetica" size=5><B>U</B>ser<B>T</B>raf<B>M</B>anager</FONT></TD></TR><TR><TD align=center><FONT face="Tahoma,Arial,Helvetica" size=2><B>billing system</B></FONT></TD></TR></TABLE></TD>

<TD align=right valign=bottom></TD></TR>
</TABLE></TD></TR>
<TR><TD width=20% bgcolor=#FFFFFF valign=top><TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD align=left valign=top>&nbsp;</TD></TR>
</TABLE></TD>
<TD width=80% bgcolor=#FFFFFF valign=top><TABLE width=100% cellspacing=5 cellpadding=0 border=0>
<TR><TD align=left valign=top>

<TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD><H1>Вход в UTM</H1></TD></TR>

<FORM action="/cgi-bin/utm/aaa" method=post>
<TR><TD><TABLE width=100% cellspacing=0 cellpadding=5 border=0>
<TR><TD width=40% align=right>Логин</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=text name=login size=40></TD></TR>
<TR><TD width=40% align=right>Пароль</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=password name=password size=40></TD></TR>
<TR><TD width=40% align=right>&nbsp;</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=submit value="ВХОД"></TD></TR>
<INPUT type=hidden name=cmd value=user_verify>
</TABLE></TD></TR>
</FORM>
</TABLE>

</TD></TR>
</TABLE></TD></TR>
</TABLE></TD></TR>
</TABLE>

</BODY>

</HTML>

Если можна с примером !
Заранее спасибо !!!
Отвечает: Евгений http://decoding.narod.ru 
Если через TWebBrowser, то так:
// Грузим страницу
procedure TForm1.FormCreate(Sender: TObject);
begin
   WebBrowser1.Navigate( 'Some URL' );
end;

// А потом так
procedure TForm1.Button1Click(Sender: TObject);
var
  ovElements: OleVariant;
  i: Integer;
begin
   ovElements := WebBrowser1.OleObject.Document.Forms.Item( 0 ).Elements;
   for i := 0 to ( ovElements.Length-1 ) do
   begin
      // Вставляем логин
      if ( AnsiUpperCase( ovElements.Item( i ).tagName ) = 'INPUT' ) then
            if ( ovElements.item( i ).name = 'login' ) then
               ovElements.Item( i ).Value := 'Some Login';

      // Вставляем логин
      if ( AnsiUpperCase( ovElements.Item( i ).tagName ) = 'INPUT' ) then
            if ( ovElements.item( i ).name = 'password' ) then
               ovElements.Item( i ).Value := 'Some Password';

      // Жмем на кнопку
      if ( AnsiUpperCase( ovElements.Item( i ).tagName ) = 'INPUT' ) then
         if ( AnsiUpperCase( ovElements.Item( i ).type ) = 'SUBMIT' ) or
            ( AnsiUpperCase( ovElements.Item( i ).type ) = 'BUTTON' ) then
            if ( AnsiUpperCase( ovElements.item( i ).Value ) = 'ВХОД' ) then
                ovElements.Item( i ).Click;
   end;
end;
Отвечает: tmp 
Используй Winsock. Подключаешься к серверу и используешь методы GET и POST
Отвечает: Владимир Круглов 
Твой HTML:
<!-- UTM template: classic. File: aaa_login.tpl. Copyright (C) 2002,2003 NetUP -->
<HTML>

<HEAD>
<TITLE>Вход в UTM</TITLE>

</HEAD>

<BODY marginheight=10 marginwidth=10 leftmargin=10 topmargin=10 vlink=#551A8B link=#0000EE text=#000000 bgcolor=#FFFFFF>

<TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD bgcolor=#43AA2E><TABLE width=100% cellspacing=1 cellpadding=0 border=0>
<TR><TD bgcolor=#E0EED3 colspan=2><TABLE width=100% cellspacing=5 cellpadding=0 border=0>
<TR><TD align=left valign=middle><TABLE cellspacing=0 cellpadding=0 border=0><TR><TD align=left><FONT face="Tahoma,Arial,Helvetica" size=5><B>U</B>ser<B>T</B>raf<B>M</B>anager</FONT></TD></TR><TR><TD align=center><FONT face="Tahoma,Arial,Helvetica" size=2><B>billing system</B></FONT></TD></TR></TABLE></TD>

<TD align=right valign=bottom></TD></TR>
</TABLE></TD></TR>
<TR><TD width=20% bgcolor=#FFFFFF valign=top><TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD align=left valign=top>&nbsp;</TD></TR>
</TABLE></TD>
<TD width=80% bgcolor=#FFFFFF valign=top><TABLE width=100% cellspacing=5 cellpadding=0 border=0>
<TR><TD align=left valign=top>

<TABLE width=100% cellspacing=0 cellpadding=0 border=0>
<TR><TD><H1>Вход в UTM</H1></TD></TR>

<FORM action="utm/aaa.php" method=post>
<TR><TD><TABLE width=100% cellspacing=0 cellpadding=5 border=0>
<TR><TD width=40% align=right>Логин</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=text name=login size=40></TD></TR>
<TR><TD width=40% align=right>Пароль</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=password name=password size=40></TD></TR>
<TR><TD width=40% align=right>&nbsp;</TD><TD>&nbsp;</TD><TD width=60% align=left><INPUT type=submit value="ВХОД"></TD></TR>
<INPUT type=hidden name=cmd value=user_verify>
</TABLE></TD></TR>
</FORM>
</TABLE>

</TD></TR>
</TABLE></TD></TR>
</TABLE></TD></TR>
</TABLE>

</BODY>

</HTML>

Создаем папку /utm (без cgi-bin) в тексте HTML видно. И пишем скрипт PHP (файл aaa.php с адресом: /utm/aaa.php)

<html>
<head>
<title>Result</title>
</head>

<body>
<?php

$login = $_REQUEST["login"];
$password = $_REQUEST["password"];

if ((!$password)|(!$login)) //Проверка пустой формы
{
print "<h3>Message... Please Enter login and Password</h3>";
}
else
if (($password != "YouPassword") | ($login != "YouLogin")) //Заменяй YouPassword и YouLogin на нужные
{
print "Bad login-password"; //Сообщение при несовпадении
}
else
print <<<VK
OK
// Тут HTML-код страницы.
//При совпадении passw и login
// ...
VK;

?>
</body>
</html>



Статья:    "Нарезка и склейка файлов." http://decoding.narod.ru/practic/cutfile/cutfile.html


Для начала определимся с методом решения. Можно воспользоваться процедурами BlockRead и BlockWrite, а можно использовать поток TFileStream. С моей (субъективной) точки зрения, процедуры вроде BlockRead и BlockWrite морально устарели. По этому я, не колеблясь, выбрал второй вариант.

Рассмотрим основные свойства и методы класса TFileStream, которые пригодятся нам для решения этой задачи.

    TFileStream
  • Create - создает экземпляр потока. Первый параметр - имя файла, с которым нам предстоит работать. В качестве второго параметра передаются флаги, определяющие метод работы с файлом. Я рассмотрю только те флаги, которые нам пригодятся, информацию о других флагах вы можете посмотреть в справочной системе Delphi.
    • fmCreate - создает файл с указанным именем.
    • fmOpenRead - открывает файл на чтение.
    • fmOpenWrite - открывает файл на запись.
  • Position - возвращает текущую позицию в потоке (количество байт от начала данных).
  • Size - возвращает размер потока в байтах.
  • CopyFrom - копирует указанное число байтов из одного потока в другой.
  • Free - Уничтожает объект и освобождает связанную с ним память.
Теперь посмотрим на функцию нарезки файла. Пусть вас не пугает ее размер, все достаточно просто, да и комментариев тоже хватает.


(* Функция для нарезки файла *)
function CutFileStream( inFile, OutPath: string; outSize: Cardinal;
                        PB: TProgressBar = nil ): boolean;
var
  inStream: TFileStream;  // Входной файловый поток
  outStream: TFileStream; // Выходной файловый поток
  posStream: Cardinal;    // Текущая позиция во входном потоке
  fCount: Cardinal;       // Количество выходных файлов
  fSize: Cardinal;        // Размер входного файла
  currentFile: Cardinal;  // Номер текущего выходного файла
  outFileName: string;    // Шаблон выходного имени файла
  longExt: Cardinal;      // Количество цифр в расширении выходного файла
begin
   // Если файл не найден, выходим
   if not FileExists( inFile ) then
   begin
      Result := false;
      Exit;
   end;

   // Выходной файл не может быть больше входного или равен ему
   inStream := TFileStream.Create( inFile, fmOpenRead );
   fSize := InStream.Size;
   if outSize >= fSize then
   begin
      Result := false;
      Exit;
   end;

   // Инициализируем переменные
   Result := true;
   posStream := 0;
   currentFile := 1;
   if PB <> nil then
   begin
      PB.Position := 0;
      PB.Max := fSize;
   end;

   // Узнаем количество выходных файлов
   fCount := inStream.Size div outSize;
   if ( inStream.Size mod outSize ) <> 0 then
      Inc( fCount );

   // В этом блоке, зная количество выходных файлов,
   // мы определяем, сколько цифр должно быть
   // в расширении выходного файла. Например:
   //    fCount < 10   => *.#f
   //    fCount < 100  => *.##f
   //    fCount < 1000 => *.###f и т.д.
   longExt := Length( Format( '%d', [fCount] ) );
   if OutPath[Length( OutPath )] <> '\' then
      OutPath := OutPath + '\';
   outFileName := OutPath + ExtractFileName( inFile ) + '.f%.' + IntToStr( longExt ) + 'd';

   // Здесь происходит нарезка файла
   repeat
      OutStream := TFileStream.Create( Format( outFileName, [currentFile] ), fmCreate );
      InStream.Position := posStream;
      if ( fSize - posStream ) < outSize then
         OutStream.CopyFrom( InStream, fSize - posStream )
      else
         OutStream.CopyFrom( InStream, outSize );
      OutStream.Free;
      posStream := posStream + outSize;
      if PB <> nil then PB.Position := posStream;
      Inc( currentFile );
      Application.ProcessMessages;
   until posStream >= fSize;

   if PB <> nil then PB.Position := 0;
   inStream.Free;
end;

Начинаем разбираться. Первым делом проверяем наличие входного файла, и если он не найден, благополучно выходим из процедуры. Сразу проверим размер выходного файла, он не должен превышать размер препарируемого файла. Если же все нормально, то создаем экземпляр потока, и открываем на чтение файл, который собираемся разрезать. Далее идет инициализация переменных, пропустим это место. Затем идет определение количества выходных файлов, остановлюсь на этом немного подробнее. Номер текущего выходного файла записывается в его расширение, в дальнейшем, по этим номерам файлы будут собраны. Сколько же цифр должно быть в расширении? Допустим 2. Тогда максимальное количество выходных файлов не должно превышать 99. По идее этого вполне достаточно, сложно представить ситуацию, когда придется "крошить" файл более мелко. Но если все же этот предел будет превышен, мы неминуемо попадем в неприятную ситуацию, связанную с повтором номеров. Тогда почему не увеличить количество цифр, скажем до 3. Теперь максимальное количество выходных файлов не должно превышать 999. Запас огромный (хотя его совсем не сложно преодолеть). А если выходных файлов будет мало, то в начале расширения будут присутствовать бесполезные нули, что с моей точки зрения выглядит не очень хорошо. К чему я все это рассказал. С моей точки зрения подобный подход имеет два больших минуса. Во-первых: слишком маленький предел мы задать не можем, велика вероятность выхода за эти пределы, что приведет к печальным последствиям. С другой стороны, большой предел приведет к тому, что в расширении будет много цифр, а при небольшом количестве выходных файлов это будет смотреться нелепо (например *.00001, *.00002 и т.д.). Во-вторых: программа просто лишается универсальности. Именно поэтому я предпочитаю производить подобный расчет для каждого нарезаемого файла. Завершает процедуру непосредственно нарезка файла.

Половина дела сделана. Файл нарезан, теперь осталось собрать все части файла в одно целое. Для начала подготовим список файлов, которые будем объединять. Файлы будем выбирать при помощи OpenDialog1 с включенной опцией ofAllowMultiSelect. Имена всех файлов помещаем в строковый массив tmp. Рассмотрим, как подготавливается этот массив.


var
  Form1: TForm1;
  tmp: array of string;

 ...

(* Открываем файлы, которые нужно склеить *)
procedure TForm1.SelectStickFileClick(Sender: TObject);
var
  i: integer;
begin
   OpenDialog.Options := OpenDialog.Options + [ofAllowMultiSelect];
   if OpenDialog.Execute then
   begin
      // Устанавливаем длинну массива
      SetLength( tmp, OpenDialog.Files.Count );
      // Заполняем массив
      for i := Low( tmp ) to High( tmp ) do
         tmp[i] := OpenDialog.Files.Strings[i];
      // Обязательно сортируем
      Sort( tmp );
      // Выводим результат
      for i := Low( tmp ) to High( tmp ) do
         ListBoxForStick.Items.Add( tmp[i] );
      EditStickDir.Text := ExtractFilePath( OpenDialog.FileName );
   end;
end;

Здесь все просто и понятно, скажу пару слов о сортировке. Несмотря на то, что в открытом диалоге все файлы упорядочены, не факт, что они упорядочены и в OpenDialog1.Files.Strings. Если массив не отсортировать, результат может оказаться непредсказуемым. Не стану приводить здесь описание функции сортировки Sort, вы можете написать ее сами. Разберем функцию склейки файла.


(* Функция для склейки файла *)
function StickFileStream( inFiles: array of string; outDir: string;
                          PB: TProgressBar = nil ): boolean;
var
  inStream: TFileStream;  // Входной файловый поток
  outStream: TFileStream; // Выходной файловый поток
  outFileName: string;    // Шаблон выходного имени файла
  recFirstFile: boolean;  // Признак записи первого файла
  i: integer;             // Цикловая переменная
begin
   // Инициализируем переменные
   if PB <> nil then
   begin
      PB.Position := 0;
      PB.Max := GetSizeAllFiles( inFiles );
   end;
   recFirstFile := false;
   outFileName := outDir + ExtractFileNameEx( inFiles[0] );

   // Здесь происходит склейка файлов
   for i := Low( inFiles ) to High( inFiles ) do
   begin
      inStream := TFileStream.Create( inFiles[i], fmOpenRead );

      // При записи первой части файла выходной файл создается,
      // при записи всех последующих выходной файл открывается на запись
      if recFirstFile then
         outStream := TFileStream.Create( outFileName, fmOpenWrite )
      else
      begin
         outStream := TFileStream.Create( outFileName, fmCreate );
         recFirstFile := true;
      end;

      outStream.Position := outStream.Size;
      outStream.CopyFrom( inStream, inStream.Size );

      if PB <> nil then
         PB.Position := outStream.Size + inStream.Size;

      outStream.Free;
      inStream.Free;
      Application.ProcessMessages;
   end;

   if PB <> nil then PB.Position := 0;
   Result := true;
end;

В отличие от стандартной функции ExtractFileName, ExtractFileNameEx (ее код приведен ниже) возвращает имя файла без расширения. Если необходимо показать ход выполнения операции склеивания файлов в ProgressBar1, то функция GetSizeAllFiles (она так же приведена ниже) позволит определить размер конечного файла, а, следовательно, и ProgressBar1.Max.


(* Функция возвращает имя файла без расширения *)
function ExtractFileNameEx( fName: string ): string;
begin
   if FileExists( fName ) then
   begin
      Result := ExtractFileName( fName );
      Delete( Result, LastDelimiter( '.', Result ), Length( Result ) );
   end
   else
      Result := '';
end;

(* Функция находит общий размер склеиваемых файлов *)
function GetSizeAllFiles( var x: array of string ): longint;
var
  i: integer;
  sr: TSearchRec;
begin
   Result := 0;
   for i := Low( x ) to High( x ) do
      if FileExists( x[i] ) then
      begin
         FindFirst( x[i], faAnyFile, sr );
         Result := Result + sr.Size;
         FindClose( sr );
      end;
end;

На сегодня это все. Удачи в программировании.

.: Пример к данной статье :.

Файлы:    

WindInfo 
Автор: Даниил Карапетян 
Небольшая утилита, которая выводит информацию об окне (handle, ClassName, позицию...), над которым находится курсор мыши.

Object viewer 
Автор: Николай Мерзляков 
Программа, которая как и предидущая выводит информацию об окнах, которые работают в данный момент в системе, но имеет 
больше возможностей. Имеет русский интерфейс.

Windows Inspector 
Автор: Zinovaty Konstantin 
Данная программа похожа на Object viewer, сложно сказать какая из них лучше. Показывает больше информации. Имеет английский интерфейс.

Создатель произвольных форм 
Автор: Алексей Дубинин 
Данная программа предназначена для облегчения создания в среде программирования Delphi окон, имеющих название Splash-окна. Программа написана на основе функций API с использованием регионов. При работе с программой, вы можете создать свой проект как автоматически, определяя границы будущей формы, так и вручную, и с использованием правильных геометрических фигур: круг, прямоугольник, эллипс.

Helper 
Автор: Вахопский Р.Э. 
Программа, позволяющая автоматически создавать MessageBox-ы любой сложности. Имея эту программу не обязательно даже знать все флаги и параметры Application.MessageBox(), просто в программе ставишь флажки там, где тебе надо и у тебя появляется код мессагбокса. Программа генерирует мессагбоксы для Delphi. И это еще далеко не все возможности программы. Среди прочих: получение ASCII кодов клавиш и т.д. Одним словом программа для новичков и лентяев (последним в программировании делать нечего), к тожу же автору было бы неплохо немного доработать свою программу.

Borland Database Engine 5.11 
Очень часто бывает проблема с переносом приложения на другую машину, особенно это касается приложений, использующих BDE. Порадуйтесь немного, теперь можно скачать дистрибутив BDE отдельно!!!! 
bdesetup.exe bdesetup.w02 bdesetup.w03 bdesetup.w04 bdesetup.w05

BDE 
Еще один дистрибутив, который установит на ваш компьютер необходимые файлы для работы с BDE. 
disk1.zip disk2.zip disk3.zip disk4.zip 


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/     - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/  - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru     - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.
http://www.p-lib.pp.ru/    - На сайте находится множество статей по Visual C++, Visual Basic, ASP.NET/ASP, Delphi, Java, Базам Данных, PHP, Perl и т. д. Кроме того есть каталог сайтов, свежие компьютерные новости, софт, книги и многое другое.

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

:)

- В чем особенность раздвоения личности у программистов?
- Может быть много субличностей, но одна из них - обязательно Админ!

:)

Идет программист, вдруг на дорогу лягушка выпрыгивает и говорит человечеким голосом:
- Меня заколдовал злой колдун, а самом деле я - красивая девушка. Если меня поцелуешь, я расколдуюсь и буду твоя.
Он молча кладет ее в карман и идет дальше.
Лягушка:
- Ты, наверное, не понял! Я - красивая девушка, меня надо расколдовать...
- Понимаешь, я программист. Девушки меня не интересуют. А вот говорящая лягушка - это прикольно!

:)

Первым хакером признан Старик, закачавший через сеть особняк, дворянский титул и новое корыто.

:)

По ссылке "забыли пароль?"
пользователю должна загружаться страница с сообщением:
"Ну и дурак!"

:)

Когда вас на работе отчитывает шеф, это выглядит так, как будто он пытается пересказать вашу биографию "в переводе гоблина".


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

Рассылки Subscribe.Ru
Программирование на Delphi
Рассылка сайта Delphi coding


Все кто хочет изучить 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
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное