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

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


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

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

Выпуск : № 21


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


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

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


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


Вопрос № 31 задаёт: teddy bear Ответить
Как по нажатию на ссылку в WebBrowser перевести курсор в Edit?
Такой код не почему-то работает:
procedure TForm1.WBBeforeNavigate2(Sender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
begin
If URL = 'link' then
// link - нажатая ссылка
begin
Edit1.SetFocus;
Edit1.SelStart := length(Edit1.Text);
Edit1.SelText := '';
end;
end;
Вопрос № 32 задаёт: karty68 Ответить
Здравствуйте. У меня несколько пробем, которые я не могу решить.
Помогите мне пожалуйста:
1.Как с помощью ADO прочитать данные из memo поля mdb БД и преобразовать их в widestring
2.Можнр ли преобразовать pointer(н-р, Node.Data) в string или integer для дальнейшего поиска в БД. А может как по другому?
Спасибо

Ответы.

Вопрос № 26 задаёт: Валов Александр Михайлович Ответить
Здравствуйте! У меня есть база данных, в каждой таблице есть поле «MODI». Подскажите пожалуйста, как мне простыми средствами (без написания процедур для каждой таблицы) создать копию базы данных с единственным отличием: таблицы новой базы должны содержать записи с ненулевым значением поля «MODI».
Отвечает: Vadim
Какая СУБД, какой тип поля MODI,
нужна ли ему уникальность и есть ли в стартовой БД нулевые значения этого поля????
Вопрос № 27 задаёт: Spider Ответить
Я себе сделал маленькую программку, которая меняет картинку на кнопке "пуск". Но у неё есть один недостаток - она очень загружает компьютер. У меня есть 2 вопроса по этому поводу :).
1. Как нужно сделать, чтоб эта прога при её выключении освобождала все ресурсы?
2. Приведите пожалуйста пример использования Thumbnails в Delphi приложениях.
Большое спасибо! :)
Отвечает: teddy bear
Пример присваения кнопке пуск картинки 'picture.bmp'
procedure TForm1.Button1Click(Sender: TObject);
Var
NewImage: TPicture;
StartButton: hWnd;
OldBitmap: THandle;
begin
NewImage := TPicture.create;
NewImage.LoadFromFile('picture.bmp');
StartButton := FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button', nil);
OldBitmap := SendMessage(StartButton,BM_SetImage,0,NewImage.Bitmap.Handle);
end;

Второй вопрос: пример Thumbnails можно посмотреть в демке Delphi
C:\Program Files\Borland\Delphi6\Demos\Virtual Listview
Вопрос № 28 задаёт: Мурник Роман Ответить
У меня вопрос как легче и лучше разбить исходник на блоки, а то путаюсь при большом обьеме текста. DLL - не нравиться.
Спасибо.
Отвечает: SHKoder
используй TActionList на вкладке стандартные, еще есть комбинация клавиш Ctrl+G сможешь перейти к функции или процедуре а вообще почитай про стилизацию программирования, потом, когда научишься писать

if q true
    then begin
    end {if}
else begin
end {else}

или

case w of:
0:       begin
          end {0}
1..5:   begin
          end {1..5}
end {case}

это мой стиль, но он очень похож как говорят на болгарский
успехов
и обрати внимание на TActionList он правда рульный :)

Отвечает: teddy bear
Разбить на модули: Unit1, Unit2...
Отвечает: Vadim
1.Можно добавить несколько обычных юнитов (Unit1, Unit2,..) не содержащих формы, дать им смысловые имена, включить в uses главной формы и выложить в них свои функции и дополнительные процедуры по тематике соответственно именам. Например, юнит Settings может содержать процедуры и функции связанные с загрузкой и сохранением настроек из файлов настройки (*.ini); юнит Exchange может содержать процедуры и функции связанные с каким-либо обменом данными и т.д.
2.Дополнительная удобная возможность для быстрого перехода к той или иной части исходника появляется с использованием списка To-Do List (пункт меню View). Для этого наиболее часто интересующие места программы комментируются строкой //TODO: Любой комментарий. Такие строки автоматически попадают в список To-Do List, а переход к указанному месту осуществляется щелчком по соответствующему элементу этого списка. Более того, сам To-Do List поддерживает сортировку таких комментариев, например, по названиям или принадлежности к одному юниту (модулю), а также выделение более жирным шрифтом комментариев, которые принадлежат текущему модулю.
Вопрос № 29 задаёт: Роман М. Ответить
Здравствуйте хакеры и ламеры!
У меня вопрос: имеется форма form1 и к ней unit1.
Создаю юнит unit2, в нем разные процедуры и переменные.
в unit1 пишу: uses unit2;
в unit2 пишу: uses unit1;
я знаю что так нельзя, но мне нужно из unit1 вызывать процедуры и переменные unit2 и наоборот из unit2 вызывать unit1.
Как это провильно сделать?
Отвечает: teddy bear
> в unit2 пишу: uses unit1;
пиши, но не в разделе interface , а в разделе implementation!
Отвечает: Vadim
Подобный вопрос уже задавался ранее.
Формы, перекрёстно ссылающиеся друг на друга, нужно подключать локально, после ключевого слова implementation.
////////////////////////////////////////////////////////
var
Form1: TForm1;

implementation

{$R *.DFM}

uses Unit2;

////////////////////////////////////////////////////////
var
Form2: TForm2;

implementation

{$R *.DFM}

uses Unit1;

////////////////////////////////////////////////////////
Отвечает: Николай home page: http://www.belik.nm.ru/
Ты вообще с процедурами знаком?
Советую!!!
Отвечает: Винаков Сергей
в Unit1 в самом верху есть раздел uses, там пиши следующее:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Unit2;
// ? ? ВОТ ЗДЕСЬ

const
MapElSize = 32;
ScrollSpeed = 16;




TdfmMain = class(TDXForm)
DXDraw: TDXDraw;
DXSpriteEngine: TDXSpriteEngine;
DXImageList: TDXImageList;
DXSound: TDXSound;
DXWaveList: TDXWaveList;
DXTimer: TDXTimer;
DXInput: TDXInput;
DXPlay: TDXPlay;
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.DFM}





Вот. А в Unit2 пиши следующее, только в разделе implementation:

unit Unit2;

interface

uses
Windows, SysUtils, Graphics, DIB, Classes, DXDraws, DXSprite, DXInput;

implementation

uses
Unit1;
// ? ? ВОТ ЗДЕСЬ



Вот и всё!!! Если что не понятно – пиши. (vin_ghost@mail.ru)
Отвечает: Alex
Answer to question no.29. Roman, don't write in the unit1 "uses unit 2" and in the unit2 "uses unit 1" - delete them - compile programm without that. Compiler ask you about add units automaticaly - press [ok]. After that compile again. All were well.


Статьи:   Как установить - разорвать соединение DialUp  

Как установить - разорвать соединение DialUp

Нужно воспользоваться функциями RAS - Remote Access Service. Но проблема в том, что хотя в WIN32SDK.HLP есть описание функций из этого набора в главе "Remote Access Service Functions", но файлов импорта в поставке Delphi нету. Поэтому вы можете вручную экспортировать нужные функции из "rasapi32.dll" пользуясь справкой Delphi и MSDN, но гораздо эффективнее и умнее будет взять переведенные файлы импорта с проекта http://www.delphi-jedi.org/, в данное время точный URL для загрузки файлов импорта RAS - ftp://delphi-jedi.org/api/RAS.zip

В набор входит несколько юнитов: Ras.pas, RasAuth.pas, RasDlg.pas, RasError.pas, RasSapi.pas, RasShost.pas, и дополнительные юниты: RasUtils.pas, RasHelperClasses.pas, а также файлы из папки DEMOS с нужными константами: Lmcons.pas, LmErr.pas.

Можно эти юниты переписать по какому-нибудь пути, известному Delphi, например записать все перечисленные файлы в каталог {Каталог_Delphi}/lib и дальше просто подключать к любым программам эти модули, например:

uses
..., Ras, RasUtils, RasHelperClasses;

В RasHelperClasses.pas реализованы очень полезные классы, например TRasDialer, TRasPhonebook, TRasConnectionsList, с применением которых и построен демонстрационный пример RasDemo.dpr.

TRasDialer - инкапсулирует в себе соединение, после настройки можно устанавливать, разъединять соединение, следить за процессом установления соединения

TRasPhonebook - служит для управление существующими соединениями, позволяет создавать новые, удалять существующие соединения, переименовывать, настраивать параметры соединений

TRasConnectionsList - служит для управления текущими установленными соединениями.

У меня только одно замечание по исходному коду примера RasDemo.dpr. Там в обработчике события TMainForm.PBDialBtnClick идет настройка TRasDialer по записи из TRasPhonebook методом

RasDialer.Assign(RasPhonebook[Selected.Index]);

Но реализация метода Assign такова, что имени соединения присваивается пустая строка:

procedure TRasDialer.Assign(Source: TPersistent);
...
FParams.szEntryName := '';
...

С точкизрения RAS установка соединения с такими параметрами будет идти как независимое соединение. То есть, фактически от выбранного соединения копируются номер дозвона, номер обратного вызова, имя пользователя, пароль и домен. И устанавливается новое соединение с такими параметрами, которое к выбранному соединению никакого отношения не имеет. Но у выбранного соединения могут быть установлены необходимые для дозвона свойства, типа "Сценарий" или "Ручной набор номера".
Поэтому чтобы перенять иэти параметры, надо присвоить устанавливаемому соединению имя, аналогичное имени нужного существующего соединения. Например, переделать пример RasDemo.dpr таким образом:

procedure TMainForm.PBDialBtnClick(Sender: TObject);
var
NewDialParam: TRasDialParams;
begin
with PhonebookListView do
   if (Selected <> nil) then
   begin
     RasDialer.Assign(RasPhonebook[Selected.Index]);

     NewDialParam := RasDialer.Params ;
     StrPCopy(NewDialParam.szEntryName, RasPhonebook[Selected.Index].Name);
     RasDialer.Params := NewDialParam ;

     UserNameEdit.Text := RasDialer.UserName;
     PasswordEdit.Text := RasDialer.Password;
     PhoneNumberEdit.Text := RasDialer.PhoneNumber;
     PageControl1.ActivePage := TabSheet3;
   end;
end;

Остальные функции реализованы очень хороши и вы можете их поизучать.

И в конце хочу сделать пару замечаний:

1) скорее всего, в NT системах вы не узнаете пароля от соединения. В поле пароля будут просто зведочки. Чтобы установить соединение с паролем по умолчанию (если он сохраняется) нужно оставить пароль пустым

2) если вы хотите набрать номер в импульсном наборе, а у вас набирается в тоновом - то нужно просто поставить символ 'p' (от слова 'pulse') перед номером, например 'p1055555'. Символ 'w' обозначает ожидание гудка в линии, например, при наборе через АТС '9w1055555'.
=================
Как вытащить все телефоны к каждому соединению:
Посколько я неоправданно добрый, то вот я набросал:

{кидаем на форму ListBox1: TListBox; }

procedure TForm1.Button1Click(Sender: TObject);
const
RASBASE = 600;
ERROR_BUFFER_TOO_SMALL = RASBASE + 3;
var
ListRasEntryName: array of TRasEntryName;
pVariantRasEntry: PRasEntry;
AlternativePhoneNumber: PChar;
SizeRasEntryName, SizeRasEntry, NumEntries: cardinal;
i: integer;
begin
ListBox1.Clear ;
SizeRasEntryName := SizeOf(TRasEntryName);
SetLength(ListRasEntryName, 1);
ListRasEntryName[0].dwSize := SizeRasEntryName;
if RasEnumEntries(nil, nil, @ListRasEntryName[0], SizeRasEntryName,
     NumEntries) = ERROR_BUFFER_TOO_SMALL then
   begin
     SetLength(ListRasEntryName, NumEntries);
     for i:=0 to High(ListRasEntryName) do
       ListRasEntryName[i].dwSize :=  SizeOf(TRasEntryName);
     RasEnumEntries(nil, nil, @ListRasEntryName[0], SizeRasEntryName, NumEntries);
   end;
if NumEntries = 0 then exit;
for i:=0 to High(ListRasEntryName) do
   with ListBox1.Items, ListRasEntryName[i] do
     begin
       Add('***** ' + szEntryName + '*****');
       SizeRasEntry := 0;
       RasGetEntryProperties(nil, szEntryName, nil, SizeRasEntry, nil, nil);
       pVariantRasEntry := AllocMem(SizeRasEntry);
       try
         pVariantRasEntry^.dwSize :=SizeOf(TRasEntry);
         if RasGetEntryProperties(nil, szEntryName, pVariantRasEntry,
             SizeRasEntry, nil, nil) = 0 then
           with pVariantRasEntry^ do
             begin
               Add('Устройство связи: ' + pVariantRasEntry^.szDeviceName);
               Add('Телефоны:');
               Add(szLocalPhoneNumber);
               if dwAlternateOffset > 0 then
                 begin
                   AlternativePhoneNumber := PChar( Pointer(LongWord(pVariantRasEntry)
                       + dwAlternateOffset));
                   while lstrlen(AlternativePhoneNumber) > 0 do
                     begin
                       Add(AlternativePhoneNumber);
                       inc(AlternativePhoneNumber, lstrlen(AlternativePhoneNumber) + 1 )
                     end;
                 end;
             end
         else
           Add('Не удалось получить информацию о соединении');
       finally
         FreeMem(pVariantRasEntry);
         end;
       Add('');
     end;
end;
Я думаю это снимет все вопросы по поводу каких-то левых адресных книг...

Одно жалко - тупо скопируют код и нихрена в нем даже и не разберутся...
Piter © Из конференции:
http://delphimaster.ru

Компаненты:   

ADV Soft AppWebUpdate v.1.2a for Delphi 3,4,5,6 
Описание: Набор компонентов для Delphi необходимых для поиска и проверки новых версий и обновлений программ через Интернет. Поддерживаются HTTP и FTP протоколы, обновления могут восстанавливать закачку, если было разорвано соединение, работает с любым типом серверов. Документация и тех. поддержка на русском языке. Используя компонент мастера обновлений вы можете добавлять к вашим программам возможностьполучения новой версии или обновления через Интернет, добавив в код всего несколько строчек.
Размер: 500kb 

Состав
TAppUpdater - ядро AppWebUpdate, не визуальный компонент выполняющий все функции обновления, скачивание файлов итд.
TAppUpdateWizard - оболочка к TAppUpdater, функционально законченный волшебник обновления, позволяет добавить возможности AppWebUpdate к существующему проекту написав всего несколько строк кода.

Возможности
 Поддержка Delphi 3/4/5 и C++ Builder 5
 Поддержка протоколов HTTP, FTP, MS Network
 Поддержка HTTP прокси серверов
 Сценарий обновления в виде .INI файла
 Разные сценарии обновления с разных версий
 Возобновление прерванного обновления
 Законченный волшебник обновления с многоязыковой поддержкой - TAppUpdateWizard

Версия доступная для свободного скачивания содержит напоминания(nag screen), которые будут выводиться при запуске программы не из Delphi IDE.

Лекарство можно найти здесь: (открыть в браузере)


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

 "Одномерный массив" - это предистория "Матрицы"?


А нашенская 'едрёна вошь' в переводе 'kernel bug'...


Письмо в службу технической поддержки:
У МеНя мИгАеТ ИнДиКаТоР cApS LoCk, кАк эТо лЕчИтСя?.


- Микола, ты що свою домашню страныцю на домен "ru" засував?
- А шо?
- Так то ж "Раша"!
- От, гады! А я думав, Ридна Украина!


- Может ли человек умереть от компьютерного вируса?
- Смотря чей компьютер он им заразит.


- Какое слово из трех букв чаще всего можно увидеть на стенках туалетов в школах и вузах?
- Ваш вариант устарел. Правильный ответ - WWW.


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

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

В избранное