Выбираеш папку, кидаеш на неё букву, и в итоге получаеш новый логический диск, который ссылается на эту папку. Пока только ЕХЕшник, исходники оформлю и потом пришлю. А пока оцените, может она никому не нужна...
»»» Скачать: исходные тексты (180кб)
Вы когда нибудь задавали себе вопрос "сколь ко же букв в этом тексте"? Если да, то эта программа для Вас. Статистика русских букв, английских, цифр, слов,... Все что нужно знать о текстовом документе Вы найдете здесь.
»»» Скачать: исходные текстыдемонстрационный EXE файл (226кб)
Как определить работает ли уже данное приложение или это первая его копия?
Для Delphi 1. Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst: hWnd. Ее можно проверить перед созданием приложения и при необходимости отреагировать соответствующим образом. Если запущена только одна копия, то эта ссылка равна нулю. Пример:
procedure TForm1.FormCreate(Sender: TObject); begin {Проверяем есть ли указатель на предыдущую копию приложения} IF hPrevInst <> 0 THENBEGIN {Если есть, то выдаем сообщение и выходим} MessageDlg('Программа уже запущена!', mtError, [mbOk], 0); Halt; END; {Иначе - ничего не делаем (не мешаем созданию формы)} end;
P.S. Для выхода необходимо использовать Halt, а не Close, как хотелось бы, так как форма еще не создана
и закрывать нечего. Есть и другой способ - по списку загруженных приложений
procedure TForm1.FormCreate(Sender: TObject); VAR Wnd : hWnd; buff : ARRAY[0.. 127] OF Char; Begin Wnd := GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DOBEGIN IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0) THENBEGIN GetWindowText (Wnd, buff, sizeof (buff )); IF StrPas (buff) = Application.Title THEN BEGIN MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0); Halt; END; END; Wnd := GetWindow (Wnd, gw_hWndNext); END; End;
Еще
один интересный способ для Win32. Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениям!
и.
Пример:
program Project1; uses Windows, // Обязательно Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.RES} Const MemFileSize = 1024; MemFileName = 'one_inst_demo_memfile'; Var MemHnd : HWND; begin { Попытаемся создать файл в памяти } MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize,
MemFileName); { Если файл не существовал запускаем приложение } if GetLastError<>ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; CloseHandle(MemHnd); end.
Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения - найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку : SetForegroundWindow(Wnd); Например так:
program Project0; uses
Windows, // !!! Forms, Unit0 in 'Unit0.pas' {Form1};
var Handle1 : LongInt; Handle2 : LongInt;
{$R *.RES}
begin!
Application.Initialize; Handle1 := FindWindow('TForm1',nil); if handle1 = 0 then begin Application.CreateForm(TForm1, Form1); Application.Run; end else begin Handle2 := GetWindow(Handle1,GW_OWNER); //Чтоб заметили :) ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE); SetForegroundWindow(Handle1); // Активизируем end; end.
Комментарий от "Vladimir" (damageinc@e-mail.ru) Лучше всего использовать именованные мутексы. Главное, придумать уникальное имя для
этого мутекса. Вот пример вполне работоспособной программы:
program My1; uses Forms, Windows, Dialogs, SysUtils,
var g_hAppMutex: THandle; Wnd : hWnd; buff: array [0..127] of Char; s:string; i:integer;
function OneInstance: boolean;
begin g_hAppMutex:=CreateMutex(nil,false,PChar('AnUniqueString'+IntToStr(GetDesktopWindow))); Result:=(WaitForSingleObject(g_hAppMutex,0)<>WAIT_TIMEOUT); end;
begin Application.Initialize; Application.Title := 'SmartDecoder'; Application.HelpFile := 'Decoder.hlp'; //создаём инстанс, если его ещё нету на текущем рабочем столе g_hAppMutex:=0; if OneInstance then begin Application.CreateForm(TMainFrm, MainFrm);
Application.Run; end; if LongBool(g_hAppMutex) then //если уже есть begin ReleaseMutex(g_hA!
ppMutex); CloseHandle(g_hAppMutex); if ParamStr(1)='' then ShowMessage('Программа уже запущена на этом рабочем столе. Нажмите кнопку "OK" для передачи управления уже запущенной копии программы.'); Wnd:=GetWindow(GetTopWindow(0),gw_HWndFirst); while Wnd<>0 do begin //Если не собственное и не дочернее окно if (Wnd<>Application.Handle)and(GetWindow(Wnd,gw_Owner)=0) then begin GetWindowText(Wnd,buff,sizeof(buff)); if Copy(StrPas(buff),1,12)='SmartDecoder'
then if Wnd=GetWindowLong(Wnd,GWL_USERDATA) then begin ShowWindow(Wnd,SW_ShowNormal); SetForegroundWindow(Wnd); i:=1; while ParamStr(i)<>'' do begin s:=ParamStr(i); PostMessage(Wnd,WM_OPEN_FILE,GlobalAddAtom(PChar(s)),0);
inc(i); end; Application.Terminate;!
Exit; end; end; Wnd:=GetWindow(Wnd,gw_hWndNext); end; end; end.
Если программа уже запущена, управление будет передано существующей копии.
Описание функций Windows API (zip)
Эта статья пpедставляет кpаткий спpавочник для пpогpаммистов, котоpым тpебуется конкpетная инфоpмация по той или иной возможности интеpфейса API. Функции и пpоцедуpы Windows пеpечисляются и описываются в алфавитном поpядке. Для каждой пpоцедуpы или функции пpиводится следующая инфоpмация: заголовок пpоцедуpы или функции (в соответствии с описанием в модуле WinProcs), описание каждого паpаметpа, возвpащаемое значение и кpаткое описание выполняемого функцией действия. Изза большого объема данный справочник доступен только в виде zip-архива 96kb
Delphi 6 в подлиннике
Delphi 6 - новая версия популярной системы быстрой разработки приложений. В книге описываются инструментальные средства среды Delphi 6, приводятся основы языка программирования Object Pascal и рассматриваются компоненты, свойства, методы и события, необходимые для разработки широкого спектра программ. Особое внимание уделяется работе с базами данных. Показывается использование как локальных, так и удаленных баз данных, включая создание многоуровневых информационных систем и публикацию результатов запросов через Интернет. Благодаря большому количеству затронутых тем, подробному изложению и многочисленным примерам книга будет полезна как начинающим, так и опытным программистам.
Автор: Гофман В.
APR Software Используя формы Delphi, Вы можете расширить стандартные диалоги Windows. Нет необходимости работать с RC файлами или RES-редакторами. Вся работа внутри IDE. Расширенная поддержка событий внутри ...
» Оценка сайта: 2
Опрос населения :)
Новый журнал для программистов "RSDN Magazine". Согласны ли вы его покупать ежемесячно?
Дорогие друзья! Мы рады представить вам новый совместный проект сайтов www.rsdn.ru, delphi.mastak.ru и www.optim.ru - профессиональный журнал для программистов RSDN Magazine.
Несомненно, ваше мнение о необходимости такого журнала, содержании рубрик и темах отдельных статей поможет сделать журнал более полезным и интересным. Высказать свое мнение, проголосовать или же подписаться вы можете на сайте. Без вашего участия, нам будет трудно сделать правильный журнал!
На сайте выложен анонс пилотного выпуска журнала, вступительное слово от редакции.
Для души
Хокку дня
Старый пруд. Прыгнула в воду лягушка. Всплеск в тишине.
Афоризмы
Женщина готова наряжаться из одной лишь любви к своей злейшей подруге (Моисей Сафир)
Фраза дня
Скажи мне кто я, и я скажу тебе кто ты.
Дурацкие законы (информация предоставлена сайтом kurilka.com)
Во Франции под угрозой штрафа запрещено фотографировать полицейских и даже полицейские машины.
В штате Нью Йорк (США) вам грозит штраф, если вы будете разговаривать в лифте, даже со знакомыми людьми.
И на закуску коротенький анекдот
Если вы никак не можете разыскать своих родственников - дайте объявление о наследстве.