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

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


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

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

Выпуск : № 38


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


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

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


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


Ожидаются

Ответы.

Вопрос № 80 задаёт:  source Ответить
Помогите разобраться плиз. ЧТо-то у меня не работает. Чувствую, что неправильно проверяю найден-ли компонент.
var
i:Integer;
s:String;
begin
for i:=0 to 100 do
  begin
    if TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient'))<>nil then 
 // Если компонент найден, то
      begin
        while TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).Connected do 
 // пока он подключен
          begin
            // cчитываем все данные в переменную s
            TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).ReadLn(s);
            // отображаем значение переменной в Memo
            TFatMemo(FindComponent(Irc_PageControl.Pages[i].Name+'_FatMemo')).Lines.Add(s); 
          end;
      end;
  end;
end;
Происходит ошибка при выполнении программы "List index out of bounds (5)" - не найден компонент, когда перебор дошел до 5 - его на самом деле нет, но он может там появиться позже
Может кто другой алгоритм посоветует? Опишите его плиз, а то мои прямые извилины сегодня не осилят логического мышления.
Отвечает: Сергей 
var
i:Integer;
s:String;
begin
for i:=0 to 100 do
  begin
    if TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient'))<>nil then 
 // Если компонент найден, то
      begin
        while TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).Connected do 
 // пока он подключен
          begin
            // cчитываем все данные в переменную s
            TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).ReadLn(s);
            // отображаем значение переменной в Memo
            TFatMemo(FindComponent(Irc_PageControl.Pages[i].Name+'_FatMemo')).Lines.Add(s); 
          end;
      end;
  end;
end;
Вобщем код правильный только более правильно будет узнать сначало узнать колличество существующих pages.
var
i:Integer;
j:Integer; //для колличества закладок в PageControl
s:String;
begin
j:=Irc_PageControl.PageCount; // Сколько на данный момент закладок.
for i:=0 to j-1 do // -1 так как покажет общее число закладок начиная с 1
  begin
        while TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).Connected do
 // пока он подключен
          begin
            // cчитываем все данные в переменную s
            TIdTCPClient(FindComponent(Irc_PageControl.Pages[i].Name+'_TCPClient')).ReadLn(s);
            // отображаем значение переменной в Memo
            TFatMemo(FindComponent(Irc_PageControl.Pages[i].Name+'_FatMemo')).Lines.Add(s); 
          end;
  end;
end;
Вопрос № 90 задаёт: Слава Ответить 
Подскажите, пожалуйста, как объявлять свои собственные типы данных и работать с ними?
Отвечает: Евгений http://decoding.narod.ru 
type
  int = integer;
  str = string[10];
  rec = record
     X, Y: int;
     S: str;
  end;
  MyClass = class
    public
      MyRec: rec;
  end;

var
  Form1: TForm1;
  C: MyClass;

procedure TForm1.FormCreate(Sender: TObject);
begin
   C := MyClass.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   C.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   with C.MyRec do
   begin
      X := -120;
      Y := 1024;
      S := '01234567890123';
      ShowMessage( Format( 'x: %d   y:%d   s:%s', [X,Y,S] ) );
   end;
end;
Отвечает: Wolfstar 
unit XXX;

type
S_Array: array of integer;


var
s: S_Array;


begin
...
end.

Дивне запитання, адже в любому підручнику з Паскалю усе розписано.
Отвечает:  Кама
Любые новые типы данных строятся на базе существующих простых при помощи
структур (record) и массивов (array):
Напр., тип данных "Информация о служащем" в виде записи:
TEmplInfo = record
  eiName1: string;
  eiName2: string;
  eiName3: string;
  eiBirthday: TDate;
end;
После того, как тип объявлен, можно работать с ним, как и с другим любым
типом Паскаля:
- объявляем переменную
var Info: TEmplInfo;
- записываем данные:
Info.eiName1 := 'Петров';
- читаем данные:
Edit1.Text := Info.eiName1;
- можно создать массив:
var
InfoArray: array [0..100] of TEmplInfo;

и обращаться к нему
for i := 0 to 100 do
InfoArray[i].eiBirthDay := Now;

Ну и так далее... Все равно книжка какая-нить понадобится.
Вопрос № 91 задаёт: Eugene Ответить 
Такой вопрос: как организовать поиск в ListBox. Нужно также, как и в Блокноте - Найти и Найти далее.
Заранее спасибо.
Отвечает: Евгений http://decoding.narod.ru  
// ListBox1.MultiSelect = false !!!Обязательно!!!
// Этим способом можно искать не только по полному
// совпадению, но и по начальным символам строки.
// Текст для поиска находится в Edit1
procedure TForm1.Button1Click(Sender: TObject);
begin
   ListBox1.Perform( LB_SELECTSTRING, ListBox1.ItemIndex,
                     longint( Pchar( Edit1.text ) ) );
end;
Отвечает: Wolfstar 
Использую конструкцию for ... DO

for i:= 0 to list1.items.count-1 do
if ... then

//вивести результат пошуку, showmessage(' '); або повідомлення з можливістю припинити цикл
//а потім продовжити далі

По пам'яті якось так


Статья:   Работа с таймером на Win API. http://decoding.narod.ru/api/timer/timer.html

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

Но сегодня мы никому вредить не будем, а просто посмотрим, как же работать с таймером. По традиции начнем с переменных.


const
  IDTimer1 = 1;
  IDTimer2 = 2;
  IDLabelTime = 3;
  IDLabelDate = 4;
  IDLabelDayOfWeek = 5;
  LabelWidth = 70;

var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;
  LabelTime: HWND;
  LabelDate: HWND;
  LabelDayOfWeek: HWND;

  t: TSystemTime;

  sYear: string;
  sMonth: string;
  sDayOfWeek: string;
  sDay: string;
  sHour: string;
  sMinute: string;
  sSecond: string;
  sMilliseconds: string;

  FormWidth: Word = 300;
  LabelLeft: Word = 10;
  Direction: boolean = true;

В этот раз переменных много, мы рассмотрим их все по мере того, как будем разбираться в программе. Из констант видно, что у нас будет два таймера и три метки. Что мы будем с ними делать? Первый таймер будет получать информацию о дате и времени на компьютере, и выводить ее на три метки в следующем виде: первая метка - день недели, вторая метка - дата, третья метка - время. Второй таймер будет перемещать метки по форме в горизонтальном направлении, (метки будут как бы отскакивать от краев формы).

Чтобы создать таймер, нужно воспользоваться функцией SetTimer.


SetTimer( Wnd, IDTimer1, 10, nil );
SetTimer( Wnd, IDTimer2, 1, nil );

Рассмотрим параметры этой функции. Первый - идентификатор окна, которому будет принадлежать таймер. Второй - идентификатор самого таймера. Третий - интервал, через который таймер будет посылать окну, которому он принадлежит, сообщение WM_TIMER. Интервал задается в миллисекундах, из расчета, что в одной секунде тысяча миллисекунд. Четвертый - указатель на процедуру TimerProc (подробности смотри в хелпе).

При выходе из программы таймеры нужно уничтожить. Для этого надо воспользоваться функцией KillTimer. Ее два параметра аналогичны первым двум параметрам функции SetTimer.


while GetMessage( Msg, 0, 0, 0 ) do
begin
   TranslateMessage( Msg );
   DispatchMessage( Msg );
end;
KillTimer( Wnd, IDTimer1 );
KillTimer( Wnd, IDTimer2 );
Halt( Msg.wParam );

Для "взаимодействия" с таймером нужно обрабатывать сообщение WM_TIMER.


function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
   case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      WM_TIMER: begin
         case ( wParam ) of
            IDTimer1: begin
               if ( LabelLeft < 10 ) or ( LabelLeft + LabelWidth > FormWidth - 10 ) then
                  Direction := not Direction;
               if Direction then
                  Inc( LabelLeft )
               else
                  Dec( LabelLeft );
               SetWindowPos( LabelDayOfWeek, 0, LabelLeft, 10, LabelWidth, 20, 0 );
               SetWindowPos( LabelDate, 0, LabelLeft, 30, LabelWidth, 20, 0 );
               SetWindowPos( LabelTime, 0, LabelLeft, 50, LabelWidth, 20, 0 );
            end;
            IDTimer2: begin
               GetLocalTime( t );
               Str( t.wDay, sDay );
               if Length( sDay ) = 1 then
                  sDay := '0' + sDay;
               Str( t.wMonth, sMonth );
               if Length( sMonth ) = 1 then
                  sMonth := '0' + sMonth;
               Str( t.wYear, sYear );
               SetWindowText( LabelTime, PChar( sHour + ':' +
                  sMinute + ':' + sSecond + ':' + sMilliseconds ) );

               Str( t.wHour, sHour );
               if Length( sHour ) = 1 then
                  sHour := '0' + sHour;
               Str( t.wMinute, sMinute );
               if Length( sMinute ) = 1 then
                  sMinute := '0' + sMinute;
               Str( t.wSecond, sSecond );
               if Length( sSecond ) = 1 then
                  sSecond := '0' + sSecond;
               Str( t.wMilliseconds, sMilliseconds );
               SetWindowText( LabelDate, PChar( sDay + '.' +
                  sMonth + '.' + sYear ) );

               case t.wDayOfWeek of
                  0: sDayOfWeek := 'Воскресенье';
                  1: sDayOfWeek := 'Понедельник';
                  2: sDayOfWeek := 'Вторник';
                  3: sDayOfWeek := 'Среда';
                  4: sDayOfWeek := 'Четверг';
                  5: sDayOfWeek := 'Пятница';
                  6: sDayOfWeek := 'Суббота';
               end;
               SetWindowText( LabelDayOfWeek, PChar( sDayOfWeek ) );
            end;
         end;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

Идентификатор таймера находится в параметре wParam сообщения WM_TIMER, здесь все просто. Посмотрим, что делает каждый таймер. Первый таймер отвечает за перемещение меток по форме. Направление перемещения зависит от значения переменной Direction и осуществляется функцией SetWindowPos. Второй таймер занимается тем, что получает текущую дату и время. Для этого нужно воспользоваться процедурой GetLocalTime, в качестве параметра ей нужно передать переменную типа TSystemTime, в которую будет помещен результат. Для того чтобы вывести полученные значения в метки, их (значения) нужно перевести из чисел в строки. В этом нам поможет процедура Str. У нее два параметра: что переводим и куда будет помещен результат. Чтобы изменить текст метки (или любого другого элемента или окна), используем процедуру SetWindowText. У нее два параметра: идентификатор окна (элемента окна), текст которого следует изменить, и сам текст.

И напоследок посмотрим, как создается форма в этом примере.


Wnd := CreateWindowEx( 0, WndClass, WndCaption, WS_OVERLAPPED or
                       WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,
                       10, 10, FormWidth, 100, 0, 0, hInstance, nil );

Раньше, в качестве флага мы указывали WS_OVERLAPPEDWINDOW, который включает в себя следующие флаги - WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX. В этом примере мы выкинули два флага: WS_MAXIMIZEBOX (делает неактивной кнопку максимизации окна) и WS_THICKFRAME (или WS_SIZEBOX, что одно и то же. Без него мы не сможем изменять размеры формы мышкой). Это упрощение сделано для того, чтобы не производить дополнительные вычисления при изменении ширины формы, что необходимо для правильной работы первого таймера.

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

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

Компоненты:   

MemoEx

Компонент, обладающий большими возможностями по сравнению с TMemo.

HintBox

Компонент, позволяющий добавлять в свое приложение окно с советами, появляющееся при старте.

dsLeds

Компонент для размещения на формах жидкокристаллических индикаторов

TAnimated

Компонент для размещения анимации на формах.

GeneBase

Набор невизуальных компонентов для работы с генетическими алгоритмами

NeuralBase

Набор невизуальных компонентов для работы с нейросетями.

ESBMaths

Обширный набор математических функций. Файл справки прилагается.

Animated Form Effect

Интересный компонент, "оживляющий" стандартные формы

EhLib 3.6 Beta

EhLib 3.6 содержит компоненты и классы для Borland Delphi 4-9 и C++ Builder 4-6, направлена на расширение возможностей клиентской части программы базы данных, при взаимодействии пользователя с приложением

TDBGridhEh TDBGridEh поддерживает всю функциональность TDBGrid'а и добавляет новые возможности

TPrintDBGridEh TPrintDBGridEh предназначена для предварительного просмотра и печати компоненты TDBGridEh:

TDBLookupComboboxEh TDBLookupComboboxEh обеспечивает всю функциональность стандартного компонента TDBLookupCombobox и добавляет несколько новых возможностей

TDBEditEh TDBEditEh предназначена для редактирования строковых значений или значений полей базы данных.

TDBDateTimeEditEh TDBDateTimeEditEh предназначена для редактирования даты или времени или значений полей базы данных.

TDBComboBoxEh TDBComboBoxEh компонента это строка ввода с выпадающим прокручиваемым списком значений подключенным к нему. Пользователь может выбирать значения из списка или ввести текст вручную.

TDBNumberEditEh TDBNumberEditEh предназначена для редактирования числовых значений или значений полей базы данных.

TDBSumList Компонента предназначена для подсчета сумм и количества записей в TDataSet'е с динамическим отслеживанием изменений.

TPreviewBox Позволяет создавать настраиваемое окно предварительного просмотра.

TPrinterPreview (no visual object) Позволяет записывать необходимые для печати данные в буфер для последующего вывода их на принтер или на экран.

TPropStorageEh Реализует технологию для сохранения свойств компонент в хранилище свойств таких как ini файлы, реестр и т.д.

AnyDAC

Бесплатные компоненты для доступа к БД Oracle, MSSQL, MySQL, DB2, Sybase ASA, MSAccess, dbExpress и ODBC.

GruCredits

Компонент эмитирует титры, как в фильмах.

Memory Map

Не всегда удобно читать и писать файлы стандартными методами. Часто приходится загружать файл в память и только потом использовать его, что отнимает очень много времени. А как хорошо было бы работать с фалом сразу же без загрузки, как с памятью! Ось же умеет делать это. Классический пример такой работы - файл подкачки, с которым система работает как с оперативной памятью. Однако некоторые программисты не используют функции отображения файлов в памяти из-за их "сложности". Этот компонент максимально упрощает задачу.

TDragWith EffectsObject

Очень часто нужно иметь возможность внутри программы перетаскивать объекты из одного компонента в другой. Например, нужно перетаскивать строки между двумя ListBox.ами. Задача несложная, но нудная, особенно если решать ее по всем правилам с правильными курсорами.


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/ - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
www.ExCode.ru - Программирование на высоком уровне

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

Афоризмы про компьютеры

Для выхода в меню нажмите Reset 
Если глюк оказался вдруг, и не друг и не враг, а баг... 
Жизнь.exe /? 
Жизнь - игра, в которой нет setup'а 
И вновь я не замечен Plug-n-Play'ем... 
...и написал Иисус конвертер water2wine, и стал раздавать его freeware... 
И ты, root? 
Иисyс изменил твою жизнь. Сохранить? (Да/Нет) 
Клаву топтать - это вам не с Джойстиком баловаться... 
Кулер тоже вертолёт. Только маленький ещё... 
Яндекс.Деньги - это система поиска денег.
"38 попугаев" - новый фильм ужасов от создателей 3DMark 2005
Программа состояла из врапперов. Под врапперами копошились баги. 
В D00M"e снова дрались депутаты...
"...Петя, не вздумай говорить с компьютерами о девушках!"


Из народных поговорок:
"Я пришел к тебе с дискетой, рассказать, что сеть упала"


Программист сидит за компьютером, целиком поглощенный работой. Тут ему жена говорит:
- Что-то я своего лифчика не нахожу, ты не знаешь, где он?
Муж, продолжает сосредоточенно работать и, не отрываясь от экрана монитора, произносит:
- Не знаю, поищи на Яндексе.


У соседей крики, мaты, Аж стена вибрирует. То Фома купил компьютер- Windows инсталирует! 


Брат брату: - Коля позвони родителям !
Коля недоумевая: - Как же я им позвоню?! У них же модема нет!


Встретились как-то Windows 95 и Linux. Linux у Windows спрашивает :
- Ты кто ?
Windows опасливо огляделась и ти-и-хо так говорит :
- Я, операционная система, а ты кто ?
Linux посмотрела по сторонам и шепотом грит:
- А я UNIX...


Ельцин звонит в Америку:
- Алё, Билл Клинтон? А кто? Билл Гейтс?
Извини, не узнал, богатым будешь...



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

Рассылки 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
Архив рассылки
Отписаться
Вспомнить пароль

В избранное