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

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


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

Выпуск : № 62

20 Марта 2006 г.


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


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

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


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


Вопрос № 160 задаёт: amorfer Ответить
Здравствуйте! Как обработать в программе кнопку свернуть/развернуть (в заголовке окна)?
Вопрос № 161 задаёт: Vlad  Ответить
Привет. У меня такой вопрос: как сделать скрин-шот полноекранного окна емулятора DOS (тоесть запущеново в Windows)? Print-Screen не работает !!!

Ответы.

Вопрос № 155 задаёт: мэйл_рфдл2 Ответить 
Delphi 7
Windows XP SP2
------------------------
Кидаю на форму ListView , добавляю один Column и пару Item' ов.
Listview1.Viewstyle="vsReport"
Запускаю приложение, пытаюсь выделить одну из строк... а именно кликаю по интересующей строке... и она становится активной/выделенной, тОлькО через 1 - 1,5 - 2 секунды.
Но после этих мертвых секунд, все летает как должно летать...

Закрываю форму... Опять запускаю приложение... опять таже картина...

Отвечает:   Александр
Посмотри в диспетчер задач и увидешь что при первом выборе строки в TTreeView создаются два потока. Видимо из-за этого и появляются 1 - 1,5 - 2 сек.
Вопрос № 156 задаёт: bakha Ответить 
Как узнать только имя файла из OpenDialog1, а не полный путь.
Отвечает:  Евгений http://decoding.narod.ru
ExtractFileName( OpenDialog1.FileName )
Отвечает: Александр 
ExtractFileName(OpenDialog1.FileName) - Возвращает имя файла
Отвечает: Трифонов Владимир 
вот пример получения только имени файла из OpenDialog
....
if opendialog1.Execute then begin
f_name:=AnsiUpperCase(ExtractFileName(Trim(OpenDialog1.Files.Strings[0])));
edit2.Text:=f_name;
end;
.....
Отвечает:  Karanchev K.V
if OpenDialog1.Execute then
ShowMessage(ExtractFileName(OpenDialog1.FileName));
Отвечает:   Илья Шевченко
Есть множество функций для работы с файловыми именами. Вот несколько из них:
1)ExtractFileName - извлекает имя с расширением
2)ExtractFileDir - извлекает путь без знака '\'
3)changeFileExt - меняет расширение файла
и т.д. более подробно написано в замечательной работе посвещенной программированию на Дельфи. Чтобы его посмотреть надо в DelphiIDE нажать кнопку F1!
Отвечает:   Ivan.Kashperuk
ExtractFileName(OpenDialog1.FileName);
Отвечает:   LeVeL
Просто сделай так:
var
  s : String;
begin
 
 if OpenDialog1.Execute then
  begin
    s:= ExtractFileName(OpenDialog1.Filename) ;
    ...
    // функция ExtractFileName извлекает из полного имени только имя файла без пути (папок)
Отвечает:   illuha
ExtratFileName(const FileName: string): string;
Возвращает имя файла с расширением, вырезанное из строки с полным именем
файла FileName.

А вобще читай справку "Процедуры и функции управления файлами".

Отвечает:   Tmp
Используй функцию ExtractFileName. Например,
ExtractFileName(OpenDialog1.FileName)
Отвечает:   Kassy
fn:=ExtractFileName(OpenDialog1.FileName);
Отвечает:   Bruder
юзай ф-ию ExtractFileName(OpenDialog1.FileName).
С её помощью можно получать имя файла из его полного пути.
ExtractFilePath(OpenDialog1.FileName) - получение пути из полного пути к файлу (файл отбрасывается)
Отвечает:   Wolfstar
Необхідно використати функцію extractfilename
var
s: string;
begin
if opendialog1.execute then
s:= extractfilename(opendialog1.filename);
end.
Отвечает:   Ян Яблоновский
Вызов функции
ExtractFileName(OpenDialog1.Filename)
вернёт тебе нужное значение.
Если же хочешь получить имя без расширения, пиши так:
S := ExtractFileName(OpenDialog1.Filename) ;
L := Length(ExtractFileExt(S)) ;
S := Copy(S,1,(Length(S)-L)) ;

где переменная S имеет тип String, а переменная L - тип Integer.
Искомое значение будет в переменной S.
На случай, ежели тебе когда-нибудь потребуется получить только путь (без имени файла), например, чтобы узнать, в какой папке лежит твой экзешник, пиши типа
ExtractFilePath(Application.ExeName)
(Глобальная переменная Application инициализируется без вмешательства программера;
из её свойств чаще всего используется ExeName - возвращает имя и путь файла экзешника, а из методов - ProcessMessages, позволяющий программе обработать накопившиеся события не выходя из текущей процедуры/функции, что полезно в циклах и для режима ожидания.)
Да, чуть не забыл:
функция ExtractFileExt возвращает расширение вместе с предшествующей ему точкой, а функция ExtractFilePath возвращает путь, включая букву имени диска и следующее за нею двоеточие (если таковые содержатся в аргументе), а оканчивается строка, возвращаемая этой функцией, символом косой черты, отделяющей путь от имени файла.
Естественно, если аргумент (которым, в принципе, может быть любая строка) не содержит расширения или пути - соответствующие функции вернут пустую строку. Они не проверяют правильность аргумента (его соответствие ограничениям, накладываемым ОС на имена файлов), и уж тем более не проверяют физическое существование файла - для этого есть булевская функция FileExists, принимающая строковый аргумент - имя файла (возможно включающее путь).
Вопрос № 157 задаёт:  God-Titan Ответить
У меня два вопроса:
1. Я программирую на Delphi 7 и у меня при обработке исключительных ситуаций (try..except) программы вечно слетают при запуске их из Delphi, но когда запускаю их обычным образом (через Проводник) программа работает как надо и исключительные ситуации работают так как и должны. Может надо, что-то в настройках Delphi изменить по поводу исключительных ситуаций? У меня Delphi настроена по умолчанию.
2. Как уменьшить размер получаемых *.EXE файлов? Я писал программу Калькулятор, в итоге ее размер составил килобайт 500-700. На мой взгляд она должна весить не более 100 Кб. Калькулятор в Windows весит 112 Кб. Были подключены стандартные модули: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls.
Может надо как-то по особому настроить среду? А, вообще, можете в кратце рассказать про эти модули и всегда ли они все нужны?
Отвечает:   Евгений http://decoding.narod.ru
Часть 1

Для Delphi5 и ниже:
Tools -> Environment Options на вкладке Preference сбрось флажок Break on exception.

Для Delphi6 и выше:
Tools -> Debugger Options на вкладке Language Exceptions сбрось флажок Stop on Delphi Exception.

Часть 2

Это недостаток ООП, которым программисты расплачиваются за удобства визуального программирования. Обрати внимание, exe с пустой формой весит несколько сотен Kb (в зависимости от версии Delphi). У тебя два выхода: 1) Сжимать исполняемый файл каким-нибудь упаковщиком (например ASPack). Это уменьшит размер программы, но "по настоящему" маленькой она не станет!!! 2)Пиши программы на Win API. По сравнению с визуальным программированием это посложнее будет, но программы будут маленькими и шустрыми)

Отвечает:   Илья Шевченко
1. Пункт меню Tools->Debugger Options. Вкладка Language Exceptions. Надо снять флажок Stop on Delphi Exceptions и все заработает как надо.
2. По этому поводу постоянно идет обсуждение на форумах. Размер большой потому, что в exe-файл компилируются компоненты и много чего лишнего. Чистый файл (который ничего не делает), но содержащий форму уже весит ~300K! Калькулятор Windows занимает так мало потому, что он написан на WinApi.
Для уменьшения размеров exe-файлов есть несколько вариантов. А именно:
1) Использовать WinApi вместо компонентов deplhi (это совершенно лишено логики, но это вариант!). Использовать написаные на с++ dll.
2) Почистить хорошо секцию uses. Например я уверен, что модули Windows и Variants тебе не понадобятся. Также полезно вместо функций showmessage и MessageDLG использовать метод application.messagebox. это избавит от использовния модуля dialogs. и.т.д.
3) Использовать программы сжатия для exe/dll. Работают они следующим образом - сжимают твой файл (примерно, как архиватор:-) ), к файлу добавляют код для распаковки самого файла, а затем добавляют переход на этот код. Таким образом при загрузке exe сначала распаковывается, а затем запускается на выполнение. С одной стороны кажется, что это замедляет работу, а с другой - основное время уходит на чтение файла с диска, а т.к. файл уменьшается в размерах в 5-6 раз, то и время загрузки уменьшается!
Отвечает:   Сергей
Можно уменьшить размер программы 2 способами:
1 - Писать программы, используя WinApi, модуль Windows и SysUtils ( без Forms,Graphics...) - долго и "муторно". Т.е. создавать форму и обрабатывать все события формы "вручную".
2 - использовать exe-сжималки, например UPX executable packer http://upx.sf.net ( я использую) сжимает от 50% до 75%,
Отвечает:   Tmp
При использовании технологии VCL(которая и обеспечивает очень удобный способ созданияформ в Delphi, а также удобный интерфейс обращения со всеми компонентами) получаем файлы больших размеров. Выхода здесь два:
писать без использования технологии VCL - используя лишь функции WinAPI - это достаточно сложно, особенно после элементарной работы с формами с VCL. Второй выход - переход на более новые версии delphi на технологию .NET. Файлы удивительным образом получаются намного меньше.
Отвечает:   Bruder
1. Если у тебя Дельфи настроена по-умолчанию, то всё должно работать как
надо => ищи баг в исходнике.
2. Есть дох... много программ для сжатия файлов. Тот же UPX. Сжимает
как zip. Степень сжатия может доходить до 40-60%. Где скачать UPX? Да
он лежит на любом сайте... Зайди на www.delphi.int.ru там лежала свежая
версия. А вообще смотри яндекс... Насчёт модулей. Можно легко узнать
нужен он тебе или нет: 1. Удаляешь его из списка и компилируешь... Если
не компилируется, то возвращай... 2. RTFM :)
Отвечает:   Ян Яблоновский
Меню Tools -> Debugger Options.
Далее во всплывающем окне вкладка Language Exceptions - убираешь галочку из чекбокса Stop on Delphi Exceptions.
Должно помочь (мне, по крайней мере, помогает).
Привет всем, а в особенности игроделам и писателям!
Отвечает:   Sergey
2. Воспользуйся компонентом KOL и MCK размер проги станет где-то в 10 раз меньше.
Взять можно на http://bonanzas.rinet.ru/
Вопрос № 159 задаёт:   Крылов И.В. Ответить
Проблема. В программе много справочников. Хочу их поместить в динамические библиотеки.
Использую ADO. Не знаю как передать соединение ADOConnection в DLL и привязать его там к ADOStoredProc или ADODataSet. Заранее спасибо.
Отвечает:   Трифонов Владимир
сообственно вот пример передачи ADO коннекта в DLL:

Сама DLL (Тут не только передается ADOConnection, но и adoquery)

library load_prav;

uses
SysUtils,
ADODB,
Classes;

{$R *.res}

procedure load_prava(idp:integer;ado:Tadoconnection;var adq:Tadoquery);stdcall;
begin
adq.Connection:=ado;
adq.Active:=false;
adq.SQL.Clear;
adq.SQL.Add('SELECT * FROM prav_form where id_prav=:idp');
adq.Parameters.ParamByName('idp').Value:=idp;
adq.Active:=true;
end;

exports load_prava;
begin
end.

А вот сам вызов этой DLL :

...
var
h:Thandle;
proc:procedure (idp:integer;ado:Tadoconnection;var adq:Tadoquery);stdcall;

implementation

{$R *.dfm}

procedure TF_main.set_akcess;
begin
//Load dll
h:=LoadLibrary('dll\load_prav.dll');
@proc:=GetProcAddress(h,'load_prava');
proc(dm.id_prav,dm.ADO,adoquery1);
adoquery1.Active:=true;
adoquery1.First;



Статья:    "Получение информации о выполняющихся процессах." 

Получить информацию о выполняющихся в данный момент на компьютере процессах можно на основе функций API. Для разных платформ эти функции отличаются, как и подключаемые для этих целей модули. Рассмотрим платформу Win95 и WinNT.

В Win95 (Windows 95/98) код может выглядеть следующим образом:
function GetProcessesWin95(var Proc: TProcArray):Integer;
var
  FSnap: THandle;
  PE: TProcessEntry32;
  PPE: PProcessEntry32;
  I: Integer;
begin
  If FSnap > 0 then CloseHandle(FSnap);
  FSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  PE.dwSize:=SizeOf(PE);
  I:=0;
  SetLength(Proc,1000); // заведомо большой массив
  If Process32First(FSnap,PE) then
    repeat
      New(PPE);
      PPE^:=PE;
      Proc[I]:=PPE.szExeFile;
      I:=I+1;
    until not Process32Next(FSnap, PE);
  Result:=I;
end;

Для работы этого кода нужно подключить в разделе USES модуль TlHelp32 (Help Tool API 32).

Функция возвращает число процессов и записывает их пути в массив-переменную Proc. Тип переменной Proc – обычный массив строк, который нужно описать в разделе описания типов:
     type TProcArray = Array of String;

Поясню основные моменты реализации кода. Строка
     FSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
означает получение "моментального снимка всех процессов". Точнее, в результате ее выполнения мы получаем дескриптор снимка. Функции Process32First и Process32Next позволяют "пробежаться" по всем процессам. О более детальной информации отсылаю читателя к справочной литературе об API.

Для NT-платформы (Windows NT/2000) аналогичный код может выглядеть следующим образом:
function GetProcessesWinNT(var Proc: TProcArray):Integer;
var
  Num: Integer;
  LP: Array[0..$3FFF-1] of Dword; // заведомо большой массив
  CB: DWord;
  CBNeeded:DWord;
  ProcHndl: THandle;
  ModHand: HModule;
  ModName: array [0..MAX_PATH] of Char;
  I: Integer;
begin
  EnumProcesses(@LP,CB,CBNeeded);
  Num:= CBNeeded div SizeOf(DWORD);
  SetLength(Proc,Num);
  For I:=0 to Num-1 do
    begin
      ProcHndl:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,LP[I]);
      If GetModuleFileNameEx(ProcHndl,ModHand,ModName,SizeOf(ModName))> 0 then
        Proc[I]:=ModName else Proc[I]:='Unknown';
    end;
  IF ProcHndl > 0 then CloseHandle(ProcHndl);
  Result:=Num;
end;

Здесь уже используется модуль PSAPI, который необходимо включить в раздел USES. Кому интересно разобраться в деталях данного кода отсылаю к справке по API.

Замечу, что под управлением WINDOWS 2000, в списке процессов я наблюдал иногда "абракадабру" по путям некоторых процессов. Предлагаю в этом вопросе читателю разобраться самостоятельно, а у меня пока до этого не дошли руки. Тем не менее, считаю, что данная статья может послужить хорошим подспорьем, для всех интересующихся данным вопросом.

В конце приведу код для определения платформы компьютера, поскольку он может понадобиться при реализации кода для вывода списка процессов. Оставляю его без комментариев.
function GetPlatform: String;
var
  VI: TOSVersionInfo;
begin
  VI.dwOSVersionInfoSize:=SizeOf(VI);
  GetVersionEx(VI);
  Case VI.dwPlatformId of
    Ver_Platform_Win32s: Result:= 'Win32s';
    Ver_Platform_Win32_Windows: Result:='Win95';
    Ver_Platform_Win32_NT: Result:='WinNT'
    else Result:='Unknown Platform';
  end;
end;

В моем модуле SysInfo v.3.00 можно найти функции получения информации о выполняемых процессах и о другой системной информации.

Copyright© 2006 Андрей Садовой


Компоненты:   

TstProgressBar

Неограниченное количество (секций) с разной степенью заполненности, расположенных на одном компоненте Надпись на каждой секции, с указанием процентов или без оного;
- 2D и 3D режимы отображения, плавно переходящие друг в друга заданием угла наклона;- Настраиваемые цвета, освещение и прозрачность термометров; Вертикальный и горизонтальный режимы показа;

TmmLanTreeView

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

TLogFile

компонент позволяющий писать лог-файл

Asko_Ds

пакет для перевода денежных единиц из цифрового формата в текстовый

AnalogGauge

Аналоговый индикатор

Тaled

компонет изображает 6 различных видов световых индикаторов

Тelipsebut

компонент рисует кнопку в виде элипса

ТCBImage

компонент показывает JPEG, BMP файлы, много настроек

Тdbf

компонент работает с базами DBF без помощи BDE

Тfreebutton

красивая и довольно привлекательная кнопка

ТIniF

компонент предназначен для записи и чтения ini-файла

ТGradBar

градиентная панель

ТProgressCyl

прггресс бар в виде цилиндра

ТLABEL3DF

LABEL с 3D эффектом

Тsysinfo

различная инфо о системе ПК

ТGRADTEXT

LABEL с градиентным эффектом

Тextrahint

hint непрямоугольной формы

ТDigit

цифровой индикатор, электронные часы

Simon

набор интересных и полезных компонентов, украшающих интерфейс программы


Интересные и полезные сайты по 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 и т. д. Кроме того есть каталог сайтов, свежие компьютерные новости, софт, книги и многое другое.

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

:)

Приходит новый русский в фирму заказывать персональный Web-сайт. Поговорил с дизайнером. Малиновый сайт, значит, будет. По фону растопырчики раскидать, музыкой "Мурку" пустить и кучи других прибамбасов. 
И тут дизайнер ему и говорит: 
- У Вас заказ получается больше пяти тысяч баксов. Поэтому я бесплатно на Ваш сайт счетчик обращений поставлю. 
Новый русский насупился: 
- А не много на себя берешь, меня на счетчик ставить?... 

:)

"Как правильно вставлять дискету 3.5?"
Обычно ее берут правой рукой и вставляют в подходящее по размерам отверстие на глубину примерно шести пальцев. Впрочем, если вы левша, можете смело использовать левую руку - запреты тут неуместны. Попробуйте проделать это с помощью губ, бедер, мышц заднего прохода - это внесет разнообразие в вашу повседневную жизнь. 

:)

Настоящий программист никогда не ставит комментариев. То, что
писалось с трудом, должно пониматься с трудом.

:)

...технология Drag & Drop не прижилась в России. Как поведал нам
слесарь Х., "я ... что ..., что ли? Если ... утащил, то уж ... не брошу"...

:)

- Верно ли, что 0 это FALSE ("ложь"), а 1 это TRUE ("правда")?
- 1!

:)

- А моя жена мне вчеpа на пейджеp какую-то фигню сбpосила, так он
pаботать пеpестал!
- ?!? Пейджеpный виpус какой-то?
- Да не пpизнаётся. Hо, по-моему, утюг, потому как тоже тепеpь не
pаботает...


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

Рассылки 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.


В избранное