Delphi - база знаний

         

Как убрать заголовок в дочерней форме MDI?


Как убрать заголовок в дочерней форме MDI?



Если в дочерней форме MDI установить BorderStyle в bsNone, то заголовок формы не исчезнет. (Об этом сказано в хелпе). А вот следующий пример решает эту проблему:

type
... = class(TForm)
{ other stuff above }
    procedure CreateParams(var Params: TCreateParams); override;
{ other stuff below }
  end;

  ...

procedure tMdiChildForm.CreateParams(var Params: tCreateParams);


begin
  inherited CreateParams(Params);
  Params.Style := Params.Style and (not WS_CAPTION);
end;


Взято с Исходников.ru


type
  TForm2 = class(TForm)
    { другой код выше }
    procedure CreateParams(var Params: TCreateParams); override;
    { другой код ниже }
  end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style and not WS_OVERLAPPEDWINDOW or WS_BORDER
end;


Взято с






Как удалить данные из BLOB-поля?


Как удалить данные из BLOB-поля?



Только с использованием SQL

UPDATE MyTable
Set MyBlobField = Null
WHERE SomeField = 'Somevalue'

Автор ответа Vit
Взято с Vingrad.ru




Как удалить файл из самого себя?


Как удалить файл из самого себя?



Очевидно что под Win32 удаление работающего кода невозможно. На время выполнения он просто добавляется к swap файлу - т.е. винды при нехватки памяти данные программы (массив переменных) сбрасывают в Swap (Page) файл, а сам код программы просто уничтожается из памяти, при возобновлении процесса, недостающие куски кода опять считываются из исходного файла. Понятно, что изменение файла пока его код выполняется будет иметь катастрофичные последствия, поэтому винды при запуске программы считают DLL или EXE файл по сути куском файла подкачки и запрещают любые манипуляции над ним. Кстати именно по этой причине все инсталляторы начинают свою работу с операции "Preparing to install", которая делает очень простую вещь - сам инсталлятор копируется во временную папку и перезапускает себя уже с винта, чтоб предотвратить крах системы при смене дискетты или CD. По этой же причине программы упакованные любыми EXE упаковщиками требуют больше памяти для запуска - так как загружается в память и исходный компрессированный код и декомпрессированный поток... Но несмотря на все сказанное можно удалить файл из "самого себя" при помощи маленькой хитрости: мы создаем и запускаем BAT файл - который и удалит программу, а саму программу закрываем, как только система "отпустит" файл - файл будет удален и затем BAT файл удалит самого себя. Пользователь всего этого не заметит - он увидит, что после завершении работы файла программы уже нет.

uses ShellApi;

procedure TForm1.FormDestroy(Sender: TObject);
var f: textFile;
  FileName: string;
begin
  FileName := changefileext(paramstr(0), '.bat');
  assignFile(f, FileName);
  rewrite(f);
  writeln(f, ':1');
  writeln(f, format('Erase "%s"', [paramstr(0)]));
  writeln(f, format('If exist "%s" Goto 1', [paramstr(0)]));
  writeln(f, format('Erase "%s"', [FileName]));
  closefile(f);
  ShellExecute(Handle, 'Open', PChar(FileName), nil, nil, sw_hide);
end;


Автор ответа: Vit
Взято с Vingrad.ru






Как удалить файл после перезагрузки Windows?


Как удалить файл после перезагрузки Windows?



Я использую функцию, которая заносит в ключ реестра RunOnce командную строку:

command.com /c del C:\Путь\Имя_файла

Автор ответа: inko
Взято с Vingrad.ru





В wininit добавляешь строку NUL={ПУТЬ УДАЛЯЕМОГО ФАЙЛА}

Автор ответа: VoL
Взято с Vingrad.ru


Еще есть способ через реестр:

uses Registry;

procedure DeleteFileOnRestart (const FileName : String);
var Reg : TRegistry;
begin 
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey ('Software\Microsoft\Windows\CurrentVersion\RunOnce', False);
  Reg.WriteString ('Selfdel9x','command.com /C del "' + FileName + '"');
  Reg.WriteString ('SelfdelNT','cmd /C del "' + FileName + '"');
  Reg.CloseKey;
  Reg.Free;
end;

Тут две команды добавляются, т.к. на XP с command.com не рабоает...
Одна из них сработает, а другая пройдет в холостую...

Прислал p0s0l



Как удалить иконку с Tray?


Как удалить иконку с Tray?




Для удаления иконки вы должны знать ее ID и дескриптор окна-обработчика сообщений. Для удаления иконки с Tray надо вызвать функцию Shell_NotifyIcon() с параметром NIM_DELETE и указателем на экземпляр структуры NOTIFYICONDATA, у которого должны быть заполнены следующие поля: cbSize, hWnd, uID.

Взято из FAQ:







Как удалить одно значение из динамического массива?


Как удалить одно значение из динамического массива?





type 
  TArrayString = array of string; 

procedure DeleteArrayIndex(var X: TArrayString; Index: Integer); 
begin 
  if Index > High(X) then Exit; 
  if Index < Low(X) then Exit; 
  if Index = High(X) then 
  begin 
    SetLength(X, Length(X) - 1); 
    Exit; 
  end; 
  Finalize(X[Index]); 
  System.Move(X[Index +1], X[Index], 
  (Length(X) - Index -1) * SizeOf(string) + 1); 
  SetLength(X, Length(X) - 1); 
end; 

// Example : Delete the second item from array a 
// Beispiel : Losche das 2. Element vom array a 

procedure TForm1.Button2Click(Sender: TObject); 
var 
  a: TArrayString; 
begin 
  DeleteArrayIndex(a, 2); 
end; 

Взято с сайта



Как удалить строку в StringGrid в run-time?


Как удалить строку в StringGrid в run-time?



Можно сделать наследника от TCustomGrid. А у последнего есть метод - DeleteRow.

Автор ответа: Song
Взято с Vingrad.ru



Например удаление текущей строки:

Type TFakeGrid=class(TCustomGrid);

procedure TForm1.MyDelete(Sender: TObject);
begin
TFakeGrid(Grid).DeleteRow(Grid.row);  
end;

Автор ответа: Vit
Взято с Vingrad.ru




Как удалить таблицу?


Как удалить таблицу?





I've been doing extensive work with Client/Server Delphi and MS SQL Server as my back-end database. The operational model that I use for my Client/Server is that the client application acts only as local interface, and that all queries and calculations - even temporary files - are performed or created on the server. Now this presents a couple of problems in that garbage cleanup isn't quite as easy as it is when using local tables as temporary files.

For instance, a lot of my programs create temporary files that I either reference later in the program or that I use as temporary storage for outer joins. Once I'm done with them, I need to delete them. With local tables, it's a snap. Just get a list of the tables, and with a little bit of code that uses some Windows API calls, delete them. Not so easy with SQL Server tables. The reason why is that you have to go through the BDE to accomplish the task - something that's not necessarily very intuitive. Luckily, however, it doesn't involve low-level BDE API calls.

Below is a procedure listing that drops tables from any SQL Server database. After the listing I'll discuss particulars...

Parameter Descriptions

//varSes : TSession;         //A valid, open session
//DBName : String;            //Name of the SQL Server DB
//ArTables : array of String; //An array of table names
//StatMsg : TStatusMsg);      //A status message callback
                             //procedure

TStatusMsg is a procedural type used as a callback procedure

type
  TStatusMsg = procedure(Msg: string);

procedure DropMSSQLTempTables(var Ses: TSession;
  DBName: string;
  ArTables: array of string;
  StatMsg: TStatusMsg);
var
  N: Integer;
  qry: TQuery;
  lst: TStringList;
begin
  lst := TStringList.Create;

  Ses.GetTableNames(DBName, '', False, False, lst);

  try
    for N := Low(arTables) to High(arTables) do
      if (lst.IndexOf(ArTables[N]) > 0) then
      begin
        StatMsg('Removing ' + arTables[N] +
          ' from client database');
        qry := TQuery.Create(nil);
        with qry do
        begin
          Active := False;
          SessionName := Ses.SessionName;
          DatabaseName := DBName;
          SQL.Add('DROP TABLE ' + arTables[N]);
          try
            ExecSQL;
          finally
            Free;
            qry := nil;
          end;
        end;
      end;
  finally
    lst.Free;
  end; { try/finally }
end;

The pseudo-code for this is pretty easy.

1.1.   Get a listing of all tables in the SQL Server database passed to the procedure.  
2.2.   Get a table name from the table name array.  
3.3.   If a passed table name happens to be in the list of table retrieved from the database, DROP it.  
4.4.   Repeat 2. and 3. until all table names have been exhausted.  

The reason why I do the comparison in step 3 is because if you issue a DROP query against a non-existent table, SQL Server will issue an exception. This methodology avoids that issue entirely.

Below is a detailed description of the parameters.

Ses   var TSession   This is a session instance variable that you pass by reference into the procedure. Note: It MUST be instantiated prior to use. The procedure does not create an instance. It assumes it already exists. This is especially necessary when using this procedure within a thread. But if you're not creating a multi- threaded application, then you can use the default Session variable.   

DBName   String   Name of the MS SQL Server client database   

ArTables   

Array of String   This is an open array of string that you can pass into the procedure. This means that you can pass any size array and the procedure will handle it. For instance, in the Primary table maker program, I define an array as follows:
arPat[0] := 'dbo.Temp0';
arPat[1] := 'dbo.Temp1';
arPat[2] := 'dbo.Temp2';
arPat[3] := 'dbo.Temp3';
arPat[4] := 'dbo.Temp4';
arPat[5] := 'dbo.Temp5';
arPat[6] := 'dbo.PatList';
arPat[7] := 'dbo.PatientList';
arPat[8] := 'dbo.EpiList';
arPat[9] := 'dbo.' + FDisease + 'CrossTbl_' + FQtrYr;
arPat[10] := 'dbo.' + FDisease + 'Primary_' + FQtrYr;

and pass it into the procedure.   

StatMsg

TStatusMsg   This is a procedural type of : procedure(Msg : String). You can't use a class method for this procedure; instead, you declare a regular procedure that references a regular procedure. For example, I declare an interface-level procedure called StatMsg that references a thread instance variable and a method as follows:

procedure StatMsg(Msg: string); 
begin   
thr.FStatMsg := Msg;   
thr.Synchronize(thr.UpdateStatus); 
end;  

The trick here is that "thr" is the instance variable used to instantiate my thread class. The instance variable resides in the main form of my application. This means that it too must be declared as an interface variable.   

I'm usually averse to using global variables and procedures. It's against structured programming conventions. However, what this procedure buys me is the ability to place it in a centralized library and utilize it in all my programs.

Before you use this, please make sure you review the table above. You need to declare a type of TStatusMsg prior to declaring the procedure. If you don't, you'll get a compilation error.

Взято с

Delphi Knowledge Base




Как удалить вертикальную полосу прокрутки (скроллбар) из DBGrid?


Как удалить вертикальную полосу прокрутки (скроллбар) из DBGrid?



Для этого необходимо переопределить метод Paint. Внутри метода Paint Вы должны вызвать API процедуру SetScrollRange для установки минимального и максимального значений скроллирования в ноль (тем самым запретив скроллбар), а затем вызвать inherited. Следующий код, это unit содержащий новый компонент под названием TNoScrollBarDBGrid, который делает это.

type 
  TNoScrollBarDBGrid = class(TDBGrid) 
  private 
  protected 
    procedure Paint; override; 
  public 
  published 
  end; 

procedure Register; 

implementation 

procedure Register; 
begin 
  RegisterComponents('Samples', [TNoScrollBarDBGrid]); 
end; 

{ TNoScrollBarDBGrid } 

procedure TNoScrollBarDBGrid.Paint; 
begin 
  SetScrollRange(Handle, SB_VERT, 0, 0, false); 
  inherited; 
end;



Взято с Исходников.ru



Как удалить/восстановить файлы из корзины?


Как удалить/восстановить файлы из корзины?




programdel;

uses
  ShellApi;

//function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall;

var
  T: TSHFileOpStruct;
  P: string;
begin
  P := 'C:\Windows\System\EL_CONTROL.CPL';
  with T do
  begin
    Wnd := 0;
    wFunc := FO_DELETE;
    pFrom := Pchar(P);
    fFlags := FOF_ALLOWUNDO
  end;
  SHFileOperation(T);
end.




Восстановление

Есть некоторые причуды, и Вы должны помнить о следующем:

Дайте полный путь для каждого файла. Не доверяйте текущей директории, даже если Вы ее изменили непосредственно перед вызовом функции. Функция WinAPI SHFileOperation не достаточно "умная" для использования текущей директории при отсутствии информации о предыдущей директории (для осуществления функции восстановления). Так, даже если используете флаг FOF_ALLOWUNDO, это не восстановит удаленные файлы из корзины, поскольку функция ничего не знает о предыдущем месторасположении файлов, и, таким образом, не сможет их восстановить файлы из корзины в их оригинальное месторасположение. Она просто удалит файлы из текущей директории.
Microsoft скорректировала документацию о члене pFrom. Новая редакция сообщает о подробностях работы в пакетном режиме: необходимо разделить имя каждого файла символом NULL (#0) и добавить к концу списка двойной символ NULL. Терминатор из двух символов NULL необходим в любом случае: работаете вы с одним файлом, или же используете пакетный режим. Иногда это работает и без терминатора, но чаще нет. Это связано с тем, что функции при работе с памятью считывает данные из памяти, располагающейся до терминатора, а поскольку длина строки может не совпадать с распределенной памятью, то данные, находящиеся после терминатора, просто не обрабатываются.
Пример правильного кодирования:



var
  FileList: string;
  FOS: TShFileOpStruct;
begin
  FileList := 'c:\delete.me'#0'c:\windows\temp.$$$'#0#0;
  { если Вы используете имена файлов в строковых переменных: }
  FileList := Filename1 + #0 + Filename2 + #0#0;
  FOS.pFrom := PChar(FileList);
  // бла бла бла
end;

 

Взято с






Как удалить все файлы из Recent Documents List?


Как удалить все файлы из Recent Documents List?



Для этого можно воспользоваться API функцией SHAddToRecentDocs:

procedure TForm1.Button1Click(Sender: TObject);
begin
SHAddToRecentDocs(SHARD_PATH, 0);  
end;

Не забудьте включить ShlObj в Unit

Взято с Исходников.ru



Как удобнее работать с буфером обмена как последовательностью байт?


Как удобнее работать с буфером обмена как последовательностью байт?





unitClipStrm;

{
  This unit is Copyright (c) Alexey Mahotkin 1997-1998
  and may be used freely for any purpose. Please mail
  your comments to
  E-Mail: alexm@hsys.msk.ru
  FidoNet: Alexey Mahotkin, 2:5020/433

  This unit was developed during incorporating of TP Lex/Yacc
  into my project. Please visit ftp://ftp.nf.ru/pub/alexm
  or FREQ FILES from 2:5020/433 or mail me to get hacked
  version of TP Lex/Yacc which works under Delphi 2.0+.
}


interface uses Classes, Windows;

type
  TClipboardStream = class(TStream)
  private
    FMemory : pointer;
    FSize : longint;
    FPosition : longint;
    FFormat : word;
  public
    constructor Create(fmt : word);
    destructor Destroy; override;

    function Read(var Buffer; Count : Longint) : Longint; override;
    function Write(const Buffer; Count : Longint) : Longint; override;
    function Seek(Offset : Longint; Origin : Word) : Longint; override;
  end;

implementation uses SysUtils;

constructor TClipboardStream.Create(fmt : word);

var
  tmp : pointer;
  FHandle : THandle;
begin
FFormat := fmt;
OpenClipboard(0);
FHandle := GetClipboardData(FFormat);
FSize := GlobalSize(FHandle);
FMemory := AllocMem(FSize);
tmp := GlobalLock(FHandle);
MoveMemory(FMemory, tmp, FSize);
GlobalUnlock(FHandle);
FPosition := 0;
CloseClipboard;
end;

destructor TClipboardStream.Destroy;
begin
FreeMem(FMemory);
end;

function TClipboardStream.Read(var Buffer; Count : longint) : longint;
begin
if FPosition + Count > FSize then
  Result := FSize - FPosition
else
  Result := Count;
MoveMemory(@Buffer, PChar(FMemory) + FPosition, Result);

Inc(FPosition, Result);
end;

function TClipboardStream.Write(const Buffer; Count : longint) : longint;
var
  FHandle : HGlobal;
  tmp : pointer;
begin
ReallocMem(FMemory, FPosition + Count);
MoveMemory(PChar(FMemory) + FPosition, @Buffer, Count);
FPosition := FPosition + Count;
FSize := FPosition;
FHandle := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, FSize);
try
  tmp := GlobalLock(FHandle);
  try
    MoveMemory(tmp, FMemory, FSize);
    OpenClipboard(0);
    SetClipboardData(FFormat, FHandle);
  finally
    GlobalUnlock(FHandle);

  end;
  CloseClipboard;
except
  GlobalFree(FHandle);
end;
Result := Count;
end;

function TClipboardStream.Seek(Offset : Longint; Origin : Word) : Longint;
begin
case Origin of
0 : FPosition := Offset;
1 : Inc(FPosition, Offset);
2 : FPosition := FSize + Offset;
end;
Result := FPosition;
end;

end.


Alexey Mahotkin alexm@hsys.msk.ru (2:5020/433)

Взято из

FAQ:
Delphi and Windows API Tips'n'Tricks
olmal@mail.ru
http://www.chat.ru/~olmal




Как указать максимальный размер текста для RichEdit Control?


Как указать максимальный размер текста для RichEdit Control?




У этого компонента есть свойство MaxLength, которое работает некорректно. Поэтому лучше пользоваться
RichEdit.Perform(EM_LIMITTEXT,нужный размер, 0); 

Причем перед каждом открытии файла это действие необходимо повторять.

Maxim Liverovskiy
(2:5030/254.38)

Если Вы передаете в качестве размера 0, то ОС ограничивает размер OS Specific Default Value. Реально, по результатам моих экспериментов, поставить можно размер, чуть меньший доступной виртуальной памяти. Я ограничился 90% от свободной виртуалки.
Для того, чтобы не повторять этот вызов (EM_LIMITTEXT), можно воспользоваться сообщением EM_EXLIMITTEXT.

Stas Mehanoshin

Автор:

StayAtHome

Взято из





Как уменьшить дату в Paradox


Как уменьшить дату в Paradox




В Local SQL для Paradox имеется ошибка, вместо вычитания происходит сложение даты с константой.



// Это добавляет единицу!
UPDATESAMPLE.DB SET DT = DT - 1

// а данное выражение даст правильный результат:
UPDATE SAMPLE.DB SET DT = DT + (-1)


Источник: http://www.delphifaq.com/fq/q0048.shtml

Взято из





Как упаковать таблицу?


Как упаковать таблицу?





usesBDE; // for D3, для D2 не помню (что-то типа DbiProcs и еще что-то)

// для пpимеpа
tLog: TTable; // таблица, юзающая d:\db\log.db

var
  TblDesc: CRTblDesc;
  rslt: DBIResult;
  Dir: string; //имеется в виду huge string т.е. {$H+}
  hDb: hDbiDb;

begin
  tLog.Active := False; //деактивиpуем TTable

  SetLength(Dir, dbiMaxNameLen + 1);
  DbiGetDirectory(tLog.DBHandle, False, PChar(Dir));
  SetLength(Dir, StrLen(PChar(Dir)));

  DbiOpenDatabase(nil, nil, dbiReadWrite, dbiOpenExcl, nil, 0, nil, nil, hDb);

  DbiSetDirectory(hDb, PChar(Dir));

  FillChar(TblDesc, sizeof(CRTblDesc), 0);
  StrPCopy(TblDesc.szTblName, 'd:\db\log.db');
  // здесь должно быть полное имя файла
  //котоpое можно: а) ввести pуками;
  //б) вытащить из пpопеpтей таблицы;
  //в) вытащить из алиаса;
  //г) см. FAQ
  StrCopy(TblDesc.szTblType, szParadox);
  //BTW тут может и szDBase стоять

  TblDesc.bPack := TRUE;

  DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False);
  DbiCloseDatabase(hDb);

end;

Автор: Pavel Kulchenko

Взято из





Как управлять сервисом на другом компьютере в W2K?


Как управлять сервисом на другом компьютере в W2K?



Требуется написать управление сервисом, запущеном на другом компьютере. С помошью чего это лучеше сделать?

uses
  Windows, Messages, SysUtils,
  StdCtrls, SvcMgr;
var
  ssStatus: TServiceStatus;
  schSCManager,
    schService: SC_HANDLE;

begin
  schSCManager := OpenSCManager(PChar('Comp1'), //имя компьютера, nil - local machine
    nil, // ServicesActive database
    SC_MANAGER_ALL_ACCESS); // full access rights

  if schSCManager = 0 then exit; //Ошибка?

  schService := OpenService(
    schSCManager, // SCM database
    PChar('SQLServerAgent'), // посмотри имя в Services. В данном случае - MS Server Agent
    SERVICE_ALL_ACCESS);

  if schService = 0 then exit; //Ошибка?

  if not QueryServiceStatus(
    schService, // handle to service
    ssStatus) then // address of status information structure
    exit; //Ошибка?

  case ssStatus.dwCurrentState of
    :
      SERVICE_RUNNING: ShowMessage('Работает!');
    SERVICE_STOPPED: ShowMessage('Выключен');
// ну и т.д.
  end;
end;

Взято с сайта



Как управлять спикером под 9х из Дельфи?


Как управлять спикером под 9х из Дельфи?



Прислал: Ненашев Илья Николаевич

Под WinNT/2000/XP вы можете использовать Beep(Tone, Duration) (задавать тон и продолжительность звучания). А под 9.x/Me эта функция не реализована, но можно командовать железом через порты, и сделать универсальную:



unit BeepUnit; 

procedure Beep(Tone, Duration: Word); // универсальная - версию виндовса проверяет 

procedure Sound(Freq : Word); 
procedure NoSound; 

procedure SetPort(address, Value:Word); 
function GetPort(address:word):word; 

implementation 

procedure SetPort(address, Value:Word); 
var 
  bValue: byte; 
begin 
  bValue := trunc(Value and 255); 
  asm 
    mov dx, address 
    mov al, bValue 
    out dx, al 
  end; 
end; 

function GetPort(address:word):word; 
var 
  bValue: byte; 
begin 
  asm 
    mov dx, address 
    in al, dx 
    mov bValue, al 
  end; 
  GetPort := bValue; 
end; 

procedure Sound(Freq : Word); 
var 
  B : Byte; 
begin 
  if Freq > 18 then begin 
    Freq := Word(1193181 div LongInt(Freq)); 
    B := Byte(GetPort($61)); 
    if (B and 3) = 0 then begin 
      SetPort($61, Word(B or 3)); 
      SetPort($43, $B6); 
    end; 
    SetPort($42, Freq); 
    SetPort($42, Freq shr 8); 
  end; 
end; 

procedure NoSound; 
var 
  Value: Word; 
begin 
  Value := GetPort($61) and $FC; 
  SetPort($61, Value); 
end; 

procedure Beep(Tone, Duration: Word); 
begin 
  if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT 
    then Windows.Beep(Tone, Duration) 
    else begin 
      Sound(Tone); 
      Windows.Sleep(Duration); 
      NoSound; 
    end; 
end; 

end.

Взято с Исходников.ru



Как установить BDE?


Как установить BDE?




programInstallPrfSt;

{
Программа иллюстрирует, как установить BDE с поддержкой PARADOX 7.0
на "чистой машине" и создать алиас.
Пример использования в качестве простейшего инсталлятора для программы
C:\MyDir\MyProg.exe
1.Создайте каталог C:\MyDir\BDE и скопируйте в него след. файлы:
CHARSET.BLL
OTHER.BLL
IDAPI32.CFG
BLW32.DLL
IDAPI32.DLL
IDBAT32.DLL
IDPDX32.DLL
IDR20009.DLL
IDSQL32.DLL
BDEADMIN.EXE - по вкусу, т.к. необходимым не является.
2.Измените значение константы AliasName на имя необходимого вам алиаса.
3.Откомпиллируйте и запустите эту программу из каталога C:\MyDir.
ВHИМАHИЕ!!! Если на машине уже установлено BDE, то перед экспериментами
сохраните (на всякий случай) след. ключи из реестра:
[HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine] и
[HKEY_LOCAL_MACHINE\SOFTWARE\Borland\BLW32].
}

{$APPTYPE CONSOLE}
uses
  Windows, BDE, Registry;

const
  AliasName: string = 'PrefStat';

var
  R: DBIResult;
  Path: string;

procedure WriteString(S1:string);
begin
  S1 := S1 + #0;
  AnsiToOem(@S1[1], @S1[1]);
  writeln(S1);
end;

function GetExePath(S1:string):string;
var
  I, K :Integer;
  S: string;
begin
  K := 1;
  S := '';
  for I := Length(S1) downto 1 do
  begin
    if S1[I] = '\' then
    begin
      K := I;
      Break;
    end;
  end;

  for I := 1 to K - 1 do
    S := S + S1[I];

  Result:=S;
end;

procedure InstallBde;
const
  Bor: string = 'SOFTWARE\Borland';
var
  a: TRegistry;
  BPath: string;
begin
  BPath:=PATH + '\BDE';
  a := TRegistry.Create;
  with a do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey(Bor + '\Database Engine', True);
    WriteString('CONFIGFILE01', BPath+'\IDAPI32.CFG');
    WriteString('DLLPATH', BPath);
    WriteString('RESOURCE', '0009');
    WriteString('SaveConfig', 'WIN32');
    WriteString('UseCount', '2');
    CloseKey;
    OpenKey(Bor+'\BLW32',True);
    WriteString('BLAPIPATH', BPath);
    WriteString('LOCALE_LIB3', BPath+'\OTHER.BLL');
    WriteString('LOCALE_LIB4', BPath+'\CHARSET.BLL');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\SYSTEM\INIT',True);
    WriteString('AUTO ODBC', 'FALSE');
    WriteString('DATA REPOSITORY', '');
    WriteString('DEFAULT DRIVER', 'PARADOX');
    WriteString('LANGDRIVER', 'ancyrr');
    WriteString('LOCAL SHARE', 'FALSE');
    WriteString('LOW MEMORY USAGE LIMIT', '32');
    WriteString('MAXBUFSIZE', '2048');
    WriteString('MAXFILEHANDLES', '48');
    WriteString('MEMSIZE', '16');
    WriteString('MINBUFSIZE', '128');
    WriteString('SHAREDMEMLOCATION', '');
    WriteString('SHAREDMEMSIZE', '2048');
    WriteString('SQLQRYMODE', '');
    WriteString('SYSFLAGS', '0');
    WriteString('VERSION', '1.0');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\SYSTEM\FORMATS\DATE',True);
    WriteString('FOURDIGITYEAR', 'TRUE');
    WriteString('LEADINGZEROD', 'FALSE');
    WriteString('LEADINGZEROM', 'FALSE');
    WriteString('MODE', '1');
    WriteString('SEPARATOR', '.');
    WriteString('YEARBIASED', 'TRUE');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\SYSTEM\FORMATS\NUMBER',True);
    WriteString('DECIMALDIGITS', '2');
    WriteString('DECIMALSEPARATOR', ',');
    WriteString('LEADINGZERON', 'TRUE');
    WriteString('THOUSANDSEPARATOR', ' ');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\SYSTEM\FORMATS\TIME',True);
    WriteString('AMSTRING', 'AM');
    WriteString('MILSECONDS', 'FALSE');
    WriteString('PMSTRING', 'PM');
    WriteString('SECONDS', 'TRUE');
    WriteString('TWELVEHOUR', 'TRUE');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\REPOSITORIES',True);
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\DRIVERS\PARADOX\INIT',True);
    WriteString('LANGDRIVER', 'ancyrr');
    WriteString('TYPE', 'FILE');
    WriteString('VERSION', '1.0');
    CloseKey;
    OpenKey(Bor+'\Database Engine\Settings\DRIVERS\PARADOX\TABLE
    CREATE',True);
    WriteString('BLOCK SIZE', '4096');
    WriteString('FILL FACTOR', '95');
    WriteString('LEVEL', '7');
    WriteString('STRICTINTEGRTY', 'TRUE');
    CloseKey;
  end;
  a.Free;
end;

begin
  Path:=GetExePath(ParamStr(0));
  R:=dbiInit(nil);
  if R<>DBIERR_NONE then
  begin
    WriteString('Инициализация BDE ...');
    InstallBDE;
  end;
  R:=dbiInit(nil);
  if R=DBIERR_NONE then
  begin
    WriteString('Инициализация BDE прошла успешно');
    DbiDeleteAlias(nil, PChar(AliasName));
    R:=DbiAddAlias(nil, PChar(AliasName), szPARADOX,
    PChar('PATH:'+Path+'\DB'), True);
    if R=DBIERR_NONE then
      WriteString('Псевдоним "'+AliasName+'" создан')
    else
      WriteString('Ошибка создания псевдонима "'+AliasName+'"');
    R:=DbiCfgSave(nil, nil, Bool(-1));
    if R=DBIERR_NONE then
      WriteString('Файл конфигурации сохранён')
    else
      WriteString('Ошибка сохранения файла конфигурации');
    DbiExit;
  end
  else
    WriteString('Ошибка инициализации BDE');
end.


Взято с





Следуйте приведенной ниже инструкции для разворачивания BDE на клиентской машине:


1.Отформатируйте две дискеты в дисководе клиентской машины. Пометьте дискеты как "Disk 1" и "Disk 2".  
2.Скопируйте файлы с DELPHI CD, содержащиеся в каталоге \REDIST\BDEINST\DISK1 на дискету, помеченную как "Disk 1", и файлы из каталога \REDIST\BDEINST\DISK2 на дискету "Disk 2".  
3.Вставьте в дисковод клиентской машины дискету, помеченную как "BDE Install 1" (в нашем примере мы используем дисковод с буквой A:).  
4.Убедитесь в том, что в Windows отсутствуют запущенные программы. В Windows Program Manager выберите File|Run, введите в поле редактирования командной строки ("Command Line") "A:\DISK1\SETUP" и нажмите "OK" для начала установки Borland Database Engine на клиентской машине.  
5.Сначала, на короткое время, появится окно "Database Engine Install", затем диалог "preparing to install...", и, наконец, диалог "BDE Redisttributable", содержащий кнопки Continue (Продолжить) и Exit (Выйти). Нажмите "Continue".  
6.Появится диалог "Borland Database Engine Location Settings", позволяющий изменить каталог установки программ BDE и конфигурационных файлов. Оставьте настройки по умолчанию и нажмите "Continue" (Продолжить).  
7.Появится диалог "Borland Database Engine Installation", позволяющий вернуться к предыдущим диалогам или начать установку. Нажмите "Install" (Установить).  
8.Процесс копирования дискеты "Disk 1" будет отображаться полоской прогресса.  
9.Появится диалог "BDE Redistributable Install Request". Вставьте дискету "Disk 2". Нажмите "continue" (Продолжить).  
10.По окончании процедуры установки появится диалог "Borland Database Engine Installation Notification", сообщающий об успешной установке BDE. Нажмите "Exit" (Выход).  
11.Завершите работу Windows, удалите дискету из дисковода и перегрузите клиентскую машину.  
12.   Если настройки по умолчанию уже где-то используются, произойдут изменения, указанные ниже.
На клиентской машине появятся два новых каталога - \IDAPI и \IDAPI\LANGDRV. Обратите внимание на то, что утилита BDE Configuration Utility, BDECFG.EXE, располагается в каталоге \IDAPI. Языковые драйвера располагаются в каталоге \IDAPI\LANGDRV как файлы *.LD. AUTOEXEC.BAT, CONFIG.SYS и SYSTEM.INI при инсталляции не изменяются.

WIN.INI в каталоге \WINDOWS\SYSTEM будет иметь новые секции:


[IDAPI]
DLLPATH=C:\IDAPI
CONFIGFILE01=C:\IDAPI\IDAPI.CFG

[Borland Language Drivers]
LDPath=C:\IDAPI\LANGDRV


Взято из

Советов по Delphi от


Сборник Kuliba




Как установить BDE из файла BDEINST.CAB?





If you have taken a close look at the listing of the BDE installation directory (usually \Program Files\Borland\Common FIles\BDE), you've noticed there's a file called BDEINST.CAB. If BDEINST.CAB isn't present in the BDE folder, you probably chose not to let it be installed. As this tip requires this file, you might want to run install again and install only BDEINST.CAB. Anyway, let's get back to the tip.

What is BDEINST.CAB?


BDEINST.CAB is a cabinet (Microsoft's compression format) file that contains only one large file: BDEINST.DLL. This DLL contains a simple installation program along with all the necessary files for a basic install of BDE. It will correctly install BDE with the native drivers for Paradox, dBase, MS Access and FoxPro. It won't install drivers for SQL database servers. If all you need is a basic installation of BDE for supporting one of the forementioned databases, then BDEINST.CAB is the best choice for you.

Given the problem InstallShield and Wise have with installing BDE 5, BDEINST.DLL has a great appeal, since it was created by the Borland folks and doesn't suffer from the same problems InstallShield and WISE do.

There is, however, a drawback: BDEINST.DLL is a quite large file, so it's that good if you're deploying on floppy disks. There's a workaround for this problem and we'll get back to it later on.

Using BDEINST.DLL


In order to use BDEINST.DLL, all you have to do is to extract it from BDEINST.CAB. There are several ways this can be done. Two of them are:

·Using WinZip or another CAB-compatible archiver. Simply extract BDEINST.DLL from the CAB file.
·Using Microsoft's EXTRACT utility that comes with Windows 9x and NT. From a DOS window, issue the command below (path is also shown):  
·  
·C:\Program Files\Borland\Common Files\BDE>EXTRACT /E BDEINST.CAB  
·  
·This will extract BDEINST.DLL to the current directory, since no destination dir was specified in the command line.  

The task now is to use the DLL. This is as simple as issuing the command line below:

C:\WINDOWS\SYSTEM\REGSVR32.EXE /S CABINST.DLL

If the command above fails, make sure you have REGSVR32.EXE on your machine. Not all machines have it, and, in case of deploying BDEINST.DLL, it's also a good idea to deploy REGSVR32.EXE. This file can be found in \WINDOWS\SYSTEM or \WINNT\SYSTEM32.

A progress dialog box will popup indicating that the installation of BDE is going ok. This is all it takes to install BDE without needing any additional tool such as InstallShield or Wise.

If you do not want to deploy REGSVR32.EXE, you can create a small VCL-less and formless application that simply calls DllRegisterServer from the DLL.

Взято с

Delphi Knowledge Base




Problem/Question/Abstract:


What are the essential files to ship with an application that uses the BDE?

Answer:

Delphi allows you to generate a nice tight executable file (.EXE), but if you have created a database application you must include the files that make up the Borland Database Engine as well. The table below shows the files that are mandatory when delivering a database application with Delphi.
File NameDescription
IDAPI01.DLL - BDE API DLL
IDBAT01.DLL - BDE Batch Utilities DLL
IDQRY01.DLL - BDE Query DLL
IDASCI01.DLL - BDE ASCII Driver DLL
IDPDX01.DLL - BDE Paradox Driver DLL
IDDBAS01.DLL - BDE dBASE Driver DLL
IDR10009.DLL - BDE Resources DLL
ILD01.DLL - Language Driver DLL
IDODBC01.DLL - BDE ODBC Socket DLL
ODBC.New - Microsoft ODBC Driver Manager DLL V2.0
ODBCINST.NEW - Microsoft ODBC Driver Installation DLL V2.0
TUTILITY.DLL - BDE Table Repair Utility DLL
BDECFG.EXE - BDE Configuration Utility DLL
BDECFG.HLP - BDE Configuration Utility Help
IDAPI.CFG -    BDE Configuation File (settings)

To assist the user, Delphi ships with an install program for exporting the appropriate files that you want deliver to your clients. Also, installation programs such as InnoSetup and InstallShield can automatically include the relevant files in their setup programs.

InnoSetup is my program installation program of choice, and it is FREE! For more information or to download a copy visit Jordan Russell's site at

Finally a tip on using the setup CAB file that ships with the BDE to install the relevant files can be found in DKB, article title "Installing BDE from BDEINST.CAB"

Взято с

Delphi Kno

wledge Base






Как установить цвет фона иконок на рабочем столе, либо сделать у них прозрачный фон?


Как установить цвет фона иконок на рабочем столе, либо сделать у них прозрачный фон?



Для этого нужно найти окно "SysListView32" (которое является списком, который содержит иконки рабочего стола). Сперва будем искать главное родительское окно "Progman", которое содержит дочернее окно "SHELLDLL_DefView" , которое в свою очередь имеет дочернее окно "SysListView32". Для этого можно воспользоваться API функцией FindWindow to. Когда Мы получим дескриптор окна "SysListView32", то можно будет воспользоваться макросами ListView_SetTextBkColor и ListView_SetTextColor для установки желаемого цвета.

Ниже приведена процедура, которая делает всё вышеперечисленное. Если параметр Trans равен true, то будет установлен прозрачный фон, иначе цвет фона будет равен Background.

unit DeskIcons;

interface
uses Graphics; // Будет использоваться TColor

procedure SetDesktopIconColor(Forground, Background: TColor; Trans: Boolean);
procedure SetDefaultIconColors;

implementation
uses Windows, CommCtrl; // будут использоваться HWND и ListView_XXXXX

procedure SetDesktopIconColor(Forground, Background: TColor; Trans: Boolean);

var
  Window: HWND;
begin
  // Находим нужное окно в три этапа
  Window := FindWindow('Progman', 'Program Manager');
  // Используем FindWindowEx для нахождения дочернего окна
  Window := FindWindowEx(Window, HWND(nil), 'SHELLDLL_DefView', '');
  // SysListView32, это список с иконками на рабочем столе
  Window := FindWindowEx(Window, HWND(nil), 'SysListView32', '');
  // Используем макрос для очистки цвета фона
  if Trans then
    ListView_SetTextBkColor(Window, $ffffffff) // фоновый цвет
  else
    ListView_SetTextBkColor(Window, Background); // фоновый цвет
  ListView_SetTextColor(Window, Forground); // передний цвет
  // теперь перерисовываем иконки
  ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
  UpdateWindow(Window);   // даём команду "немедленно перерисовать"
end;

procedure SetDefaultIconColors;
{ Эта процедура устанавливает цвета, которые заданы в
  windows по умолчанию }
var
  Kind: Integer;
  Color: TColor;
begin
  Kind := COLOR_DESKTOP;
  Color := GetSysColor(COLOR_DESKTOP);
  SetSysColors(1, Kind, Color);
end;

end.

Взято с Исходников.ru



Как установить клиента InterBase


Как установить клиента InterBase




1. Для Yaffil или FireBird последних билдов - ничего не надо, кроме gds32.dll в директориях поиска библиотек.

2. Для IB5, IB6 или старого FB первых билдов - надо дополнительно прописать в файле services строчку "gds_db 3050/tcp" {файл должен завершаться пустую строкой}.

3. Для IB5, дополнительно к п.2., добавить в ключ реестра:

HKLM\SOFTWARE\InterBase Corp\InterBase\CurrentVersion\RootDirectory

строковое значение - имя папки, в которой лежит файл ib_license.dat

4. В случае медленного подключения клиентов в сети TCP/IP попробуйте прописать адреса IB серверов в файле HOSTS.

Взято из





Как установить минимальный размер окна?


Как установить минимальный размер окна?



Необходимо объявить обработчик события для WM_GETMINMAXINFO:

... 
private 
  procedure WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo); 
  message WM_GETMINMAXINFO; 


А вот как выглядит сам обработчик:

procedure TForm1.WMGetMinMaxInfo(var Message : TWMGetMinMaxInfo); 
begin 
  Message.MinMaxInfo^.ptMinTrackSize := Point(Width, Height); 
  Message.MinMaxInfo^.ptMaxTrackSize := Point(Width, Height); 
end; 

Взято с Исходников.ru

Примечание от Vit:

Начиная с Дельфи 5 появилось удобное свойство Constrains - специально для ограничесния минимальных и максимальных размеров...



Как установить обои в формате jpeg?


Как установить обои в формате jpeg?




Как установить обои в формате jpeg.
SystemParametersInfo только для bmp.


uses
ComObj, ShlObj;

procedure ChangeActiveWallpaper;
const
  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
  ActiveDesktop: IActiveDesktop;
begin
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
  ActiveDesktop.SetWallpaper('c:\windows\forest.jpg', 0);
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
end;






Автор:

Vasya2000

Взято из





Как установить переменные окружения?


Как установить переменные окружения?



Следующая простая подпрограмма создаёт новые значения в переменных окружения. Если переменной окружения не существует, то она создаётся. Если переменной окружения установить значение пустой строки, то переменная удаляется. Функция возвращает 0, если значение переменной установлено или переменная создана успешно, либо возвратит значение ошибки Windows вслучае неудачи. Обратите внимание, что размер пространства доступного для переменных окружения ограничен.

function SetEnvVarValue(const VarName, 
  VarValue: string): Integer; 
begin 
  // Просто вызываем API функцию
  if Windows.SetEnvironmentVariable(PChar(VarName), 
    PChar(VarValue)) then 
    Result := 0 
  else 
    Result := GetLastError; 
end; 

ЗАМЕЧАНИЕ: данный способ позволяет делать изменения в переменных окружения только для текущего процесса либо для дочерних процессов, порождённых текущим.

Для того, чтобы передать какую-либо переменную окружения в дочерний процесс просто:

1) Создайте новую переменную окружения при помощи SetDOSEnvVar.
2) Запустите новую программу.

А вот как выглядит пример передачи текущих переменных окружения + переменной FOO=Bar в дочерний процесс:

{ snip ... } 
var 
  ErrCode: Integer; 
begin 
  ErrCode := SetEnvVarValue('FOO', 'Bar'); 
  if ErrCode = 0 then 
    WinExec('MyChildProg.exe', SW_SHOWNORMAL); 
  else 
    ShowMessage(SysErrorMessage(ErrCode)); 
end; 
{ ... end snip } 

Взято с Исходников.ru



Как установить разрешение экрана?


Как установить разрешение экрана?



ChangeDisplaySettings

Автор cpu
Взято с Vingrad.ru


function SetFullscreenMode:Boolean;
var DeviceMode : TDevMode;
begin
 with DeviceMode do begin
  dmSize:=SizeOf(DeviceMode);
  dmBitsPerPel:=16;
  dmPelsWidth:=640;
  dmPelsHeight:=480;
  dmFields:=DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
  result:=False;
  if ChangeDisplaySettings(DeviceMode,CDS_TEST or CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL 
   then Exit;
  Result:=ChangeDisplaySettings(DeviceMode,CDS_FULLSCREEN) = DISP_CHANGE_SUCCESSFUL;
 end;
end;

procedure RestoreDefaultMode;
var T : TDevMode absolute 0;
begin
 ChangeDisplaySettings(T,CDS_FULLSCREEN);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if setFullScreenMode then begin
  sleep(7000);
  RestoreDefaultMode;
 end;
end;

Зайцев О.В.
Владимиров А.М.
Взято с Исходников.ru





Как уведомить все приложения, что реестр был изменён?


Как уведомить все приложения, что реестр был изменён?



Для этого можно послать в систему широковещательное сообщение WM_WININICHANGE, указав в нём, что изменения касаются реестра. Большинство приложений, работа которых связана с реестром, должны реагировать на сообщение WM_WININICHANGE.

Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(PChar('RegistrySection')));
end;

Взято с Исходников.ru



Как увеличить процессорное время, выделяемого программе?


Как увеличить процессорное время, выделяемого программе?



Следующий пример изменяет приоритет приложения. Изменение приоритета следует использовать
с осторожностью - т.к. присвоение слишком высокого приоритета может привети к
медленной работе остальных программ и системы в целом. См. Win32 help for SetThreadPriority() function.

  procedure TForm1.Button1Click(Sender: TObject);  
  var    ProcessID : DWORD;   
   ProcessHandle : THandle;
   ThreadHandle : THandle;  
begin
       ProcessID := GetCurrentProcessID; 
      ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, 
                                        false,  ProcessID); 
  SetPriorityClass(ProcessHandle, REALTIME_PRIORITY_CLASS);  
  ThreadHandle := GetCurrentThread;
  SetThreadPriority(ThreadHandle, THREAD_PRIORITY_TIME_CRITICAL);
end;

Взято с сайта



Как узнать адрес LPT-порта?


Как узнать адрес LPT-порта?



Эта функция работает в Win95 и Win98.

function GetPortAddress(PortNo: integer): word; assembler; stdcall; 
asm 
  push es 
  push ebx 
  mov ebx, PortNo 
  shl ebx,1 
  mov ax,40h // Dos segment adress 
  mov es,ax 
  mov ax,ES:[ebx+6] // get port adress in 16Bit way :) 
  pop ebx 
  pop es 
end;



Для NT можно заглянуть сюда:

Взято с Исходников.ru



Как узнать browser по умолчанию?


Как узнать browser по умолчанию?




{
First we create a temporary file and call the
function FindExecutable to get the associated Application.
}


function GetAppName(Doc: string): string; 
var 
  FN, DN, RES: array[0..255] of char; 
begin 
  StrPCopy(FN, DOC); 
  DN[0]  := #0; 
  RES[0] := #0; 
  FindExecutable(FN, DN, RES); 
  Result := StrPas(RES); 
end; 

function GetTempFile(const Extension: string): string; 
var 
  Buffer: array[0..MAX_PATH] of char; 
  aFile: string; 
begin 
  GetTempPath(SizeOf(Buffer) - 1, Buffer); 
  GetTempFileName(Buffer, 'TMP', 0, Buffer); 
  SetString(aFile, Buffer, StrLen(Buffer)); 
  Result := ChangeFileExt(aFile, Extension); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  f: System.Text; 
  temp: string; 
begin 
  // get a unique temporary file name 
  // eine eindeutige Temporare Datei bekommen 
  temp := GetTempFile('.htm'); 
  // Create the file 
  // Datei erstellen 
  AssignFile(f, temp); 
  rewrite(f); 
  closefile(f); 
  // Show the path to the browser 
  // Pfad + Programmname zum Browser anzeigen. 
  ShowMessage(GetAppName(temp)); 
  // Finally delete the temporary file 
  // Temporaare Datei wieder loschen 
  Erase(f); 
end; 

//Using the Registry: 
//************************************************ 

uses 
  Registry; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  Reg: TRegistry; 
  KeyName: string; 
  ValueStr: string; 
begin 
  Reg := TRegistry.Create; 
  try 
    Reg.RootKey := HKEY_CLASSES_ROOT; 
    KeyName     := 'htmlfile\shell\open\command'; 
    if Reg.OpenKey(KeyName, False) then 
    begin 
      ValueStr := Reg.ReadString(''); 
      Reg.CloseKey; 
      ShowMessage(ValueStr); 
    end 
    else 
      ShowMessage('There is nоt a default browser'); 
  finally 
    Reg.Free; 
  end; 
end; 

//************************************************ 
{Copyright (c) by Code Central} 

type 
  TBrowserInformation = record 
    Name: string; 
    Path: string; 
    Version: string; 
  end; 

function LongPathName(ShortPathName: string): string; 
var 
  PIDL: PItemIDList; 
  Desktop: IShellFolder; 
  WidePathName: WideString; 
  AnsiPathName: AnsiString; 
begin 
  Result := ShortPathName; 
  if Succeeded(SHGetDesktopFolder(Desktop)) then 
  begin 
    WidePathName := ShortPathName; 
    if Succeeded(Desktop.ParseDisplayName(0, nil, PWideChar(WidePathName), 
      ULONG(nil^), PIDL, ULONG(nil^))) then 

      try 
        SetLength(AnsiPathName, MAX_PATH); 
        SHGetPathFromIDList(PIDL, PChar(AnsiPathName)); 
        Result := PChar(AnsiPathName); 

      finally 
        CoTaskMemFree(PIDL); 
      end; 
  end; 
end; 

function GetDefaultBrowser: TBrowserInformation; 
var 
  tmp: PChar; 
  res: LPTSTR; 
  Version: Pointer; 
  VersionInformation: Pointer; 
  VersionInformationSize: Integer; 
  Dummy: DWORD; 
begin 
  tmp := StrAlloc(255); 
  res := StrAlloc(255); 
  Version := nil; 
  try 
    GetTempPath(255, tmp); 
    if FileCreate(tmp + 'htmpl.htm') <> -1 then 
    begin 
      if FindExecutable('htmpl.htm', tmp, res) > 32 then 
      begin 
        Result.Name := ExtractFileName(res); 
        Result.Path := LongPathName(ExtractFilePath(res)); 
        // Try to determine the Browser Version 
        VersionInformationSize := GetFileVersionInfoSize(Res, Dummy); 
        if VersionInformationSize > 0 then 
        begin 
          GetMem(VersionInformation, VersionInformationSize); 
          GetFileVersionInfo(Res, 0, VersionInformationSize, VersionInformation); 
          VerQueryValue(VersionInformation, ('StringFileInfo040904E4ProductVersion'), 
            Pointer(Version), Dummy); 
          if Version <> nil then 
            Result.Version := PChar(Version); 
          FreeMem(VersionInformation); 
        end; 
      end 
      else 
        ShowMessage('Cannot determine the executable.'); 
      SysUtils.DeleteFile(tmp + 'htmpl.htm'); 
    end 
    else 
      ShowMessage('Cannot create temporary file.'); 
  finally 
    StrDispose(tmp); 
    StrDispose(res); 
  end; 
end; 

Взято с сайта



Как узнать букву CD-ROM?


Как узнать букву CD-ROM?



var DriveType: UInt;

DriveType := GetDriveType(PChar('F:\'));
if DriveType = DRIVE_CDROM then ShowMessage('Сидюк');


Взято с сайта



Как узнать, была ли перемещена форма?


Как узнать, была ли перемещена форма?



(...) 

type
  TfrmMain = class(TForm)
  private
    procedure OnMove(var Msg: TWMMove); message WM_MOVE;
  end;

  (...)

procedure TfrmMain.OnMove(var Msg: TWMMove);
begin
  inherited;
  (...)
end;

(...)

Взято с Исходников.ru



Как узнать доступен ли DCOM?


Как узнать доступен ли DCOM?





functionIsDCOMEnabled: Boolean;
var
  Ts: string;
  R: TRegistry;
begin
  r := TRegistry.Create;
  r.RootKey := HKEY_LOCAL_MACHINE;
  r.OpenKey('Software\Microsoft\OLE', False);
  ts := AnsiUpperCase(R.ReadString('EnableDCOM'));
  r.Free;
  Result := (Ts = 'Y');
end;

Взято с

Delphi Knowledge Base




function IsDCOMInstalled: Boolean;
var
  OLE32: HModule;
begin
  Result := not (IsWin95 or IsWin95OSR2);
  if not Result then
  begin
    OLE32 := LoadLibrary(COLE32DLL);
    if OLE32 > 0 then
    try
      Result := GetProcAddress(OLE32, PChar('CoCreateInstanceEx')) <> nil;
    finally
      FreeLibrary(OLE32);
    end;
  end;
end;

Взято с

Delphi Knowledge Base







Как узнать, доступен ли в сети сервер MS SQL?


Как узнать, доступен ли в сети сервер MS SQL?



Здесь представлена функция, выполняющая проверку доступности MS SQL сервера.

Function CheckMSSQLServer(fServerName, fUserName, fPsw : String) : Bool; 
Var 
  wDb : TDatabase; 
begin  // Check if MS SQL Server is reachable 
  // Важно! BDE Должна быть установлена
  Result := False; 
  wDb := TDatabase.Create(nil); 

  with wDb do 
    begin 
      DatabaseName := 'wDbDatabaseName'; // arbitrary name, must be unique 
                                         // in current Session 
      Params.Values['SERVER Name'] := fServerName; 
      Params.Values['USER Name']   := fUserName; 
      Params.Values['PASSWORD']    := fPsw; 
      LoginPrompt := False; 
    end; 

  try 
    wDb.DriverName := 'MSSQL'; 
    try 
      wDb.Connected := True; 
      wDb.Connected := False; 
    except 
      ShowMessage('Server is not reachable'); 
    end; 
    Result := True; 
  finally 
    wDb.Free; 
  end; 
end;

Взято с Исходников.ru





Как узнать есть ли у мыши колесико?


Как узнать есть ли у мыши колесико?




Свойство "WheelPresent" глобального обьекта "mouse".



Как узнать, есть ли в приёмном буфере RS232 данные?


Как узнать, есть ли в приёмном буфере RS232 данные?



При помощи функции ClearCommError можно узнать, сколько байт данных находится в буфере приёма (и буфере передачи) последовательного интерфейса.


procedure DataInBuffer(Handle: THandle; 
                       var InQueue, OutQueue: integer); 
var ComStat: TComStat; 
    e: integer; 
begin 
  if ClearCommError(Handle, e, @ComStat) then 
  begin 
    InQueue := ComStat.cbInQue; 
    OutQueue := ComStat.cbOutQue; 
  end 
  else 
  begin 
    InQueue := 0; 
    OutQueue := 0; 
  end; 
end; 

Взято с Исходников.ru



Как узнать есть ли в заданном CD-ROM'е Audio CD?


Как узнать есть ли в заданном CD-ROM'е Audio CD?





Можно использовать функцию Windows API GetDriveType() чтобы определить является ли дисковод CD-ROM'мом. И функцию API GetVolumeInformation() чтобы проверить VolumeName на равенство 'Audio CD'.
Пример:

functionIsAudioCD(Drive : char) : bool;
var
   DrivePath : string;
   MaximumComponentLength : DWORD;
   FileSystemFlags : DWORD;
   VolumeName : string;
Begin
   sult := false;
   DrivePath := Drive + ':\';
   if GetDriveType(PChar(DrivePath)) <> DRIVE_CDROM then 
      exit;
   SetLength(VolumeName, 64);
   GetVolumeInformation(PChar(DrivePath),PChar(VolumeName),
   Length(VolumeName),nil,MaximumComponentLength,FileSystemFlags,nil,0);
   if lStrCmp(PChar(VolumeName),'Audio CD') = 0 then
      result := true;
end;

function PlayAudioCD(Drive : char) : bool;
var
   mp : TMediaPlayer;
begin
   result := false;
   Application.ProcessMessages;
   if not IsAudioCD(Drive) then
      exit;
   mp := TMediaPlayer.Create(nil);
   mp.Visible := false;
   mp.Parent := Application.MainForm;
   mp.Shareable := true;
   mp.DeviceType := dtCDAudio;
   mp.FileName := Drive + ':';
   mp.Shareable := true;
   mp.Open;
   Application.ProcessMessages;
   mp.Play;
   Application.ProcessMessages;
   mp.Close;
   Application.ProcessMessages;
   mp.free;
   result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if not PlayAudioCD('D') then
      ShowMessage('Not an Audio CD');
end;



Взято из
DELPHI VCL FAQ

Перевод с английского   
Подборку, перевод и адаптацию материала подготовил Aziz(JINX)
специально для




Как узнать физические координаты каретки в пикселях?


Как узнать физические координаты каретки в пикселях?





{TRichEdit}

var
pt: TPoint;
begin
  with richedit1 do
  begin
    Perform(messages.EM_POSFROMCHAR, WPARAM(@pt), selstart);
    label1.caption := Format('(%d, %d)', [pt.x, pt.y]);
  end;
end;

{TMemo and TEdit}

var
  r: LongInt;
begin
  with memo1 do
  begin
    r := Perform(messages.EM_POSFROMCHAR, selstart, 0);
    if r >= 0 then
    begin
      label1.caption := IntToStr(HiWord(r));
      label2.caption := IntToStr(LoWord(r));
    end;
  end;
end;

Взято с

Delphi Knowledge Base






Как узнать физическое расположение локальной БД по Alias?


Как узнать физическое расположение локальной БД по Alias?




По Table(Query).Database:

uses
DbiProcs;

function GetDirByDatabase(Database: TDatabase): string;
var
  pszDir: PChar;
begin
  pszDir := StrAlloc(255);
  try
    DbiGetDirectory(Database.Handle, True, pszDir);
    Result := StrPas(pszDir);
  finally
    StrDispose(pszDir);
  end;
end;

По алиасу:

function GetPhNameByAlias(sAlias: string): string;
var
  Database: TDatabase;
  pszDir: PChar;
begin
  Database := TDatabase.Create(nil); {allocate memory}
  pszDir := StrAlloc(255);
  try
    Database.AliasName := sAlias;
    Database.DatabaseName := 'TEMP'; {requires a name -- is ignored}
    Database.Connected := True; {connect without opening any table}
    DbiGetDirectory(Database.Handle, True, pszDir); {get the dir.}
    Database.Connected := False; {disconnect}
    Result := StrPas(pszDir); {convert to a string}
  finally
    Database.Free; {free memory}
  end;
end;

Взято из







Как узнать имена установленных в системе COM-портов?


Как узнать имена установленных в системе COM-портов?



uses Registry; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  reg : TRegistry; 
  ts : TStrings; 
  i : integer; 
begin 
  reg := TRegistry.Create; 
  reg.RootKey := HKEY_LOCAL_MACHINE; 
  reg.OpenKey('hardware\devicemap\serialcomm', 
              false); 
  ts := TStringList.Create; 
  reg.GetValueNames(ts); 
  for i := 0 to ts.Count -1 do begin 
    Memo1.Lines.Add(reg.ReadString(ts.Strings[i])); 
  end; 
  ts.Free; 
  reg.CloseKey; 
  reg.free; 
end;

Взято с Исходников.ru



Как узнать имя домена Windows NT/2000?


Как узнать имя домена Windows NT/2000?




function GetNTDomainName: string; 
var hReg: TRegistry;   
begin 
hReg := TRegistry.Create;   
hReg.RootKey := HKEY_LOCAL_MACHINE;   
hReg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion   
\Winlogon', false );   
Result := hReg.ReadString( 'DefaultDomainName' );   
hReg.CloseKey;   
hReg.Destroy;   
end; 

Взято с Исходников.ru



Как узнать имя файла моей программы?


Как узнать имя файла моей программы?



Application.ExeName
ParamStr(0)
GetModuleFileName()

Автор ответа: rhf
Взято с Vingrad.ru



Как узнать имя файла текущего процесса?


Как узнать имя файла текущего процесса?



Для этого существует функция GetModuleFileName, которая возвращает имя файла текущего процесса.

function GetModName: String;
var
  fName: String;
  nsize: cardinal;
begin
  nsize := 128;
  SetLength(fName,nsize);
  SetLength(fName,
            GetModuleFileName(
              hinstance,
              pchar(fName),
              nsize));
  Result := fName;
end;

Взято с Исходников.ru



Как узнать имя компьютера?


Как узнать имя компьютера?





Function ReadComputerName:string;
var  
i:DWORD;   
p:PChar;  
begin
i:=255;  
GetMem(p, i);  
GetComputerName(p, i);  
Result:=String(p);  
FreeMem(p);  
end;

Автор Vit
Взято с Vingrad.ru




Как узнать имя пользователя?


Как узнать имя пользователя?




Function GetUserFromWindows: string;
Var
  UserName    : string;
  UserNameLen : Dword;
Begin
  UserNameLen := 255;
  SetLength(userName, UserNameLen);
  If GetUserName(PChar(UserName), UserNameLen) Then
    Result := Copy(UserName,1,UserNameLen - 1)
  Else
    Result := 'Unknown';
End;

Взято с Исходников.ru



Как узнать IP адрес?


Как узнать IP адрес?



HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\ (для 98-винды)
Ищем параметр IPAddress
Программно можно определить следующим образом:

var
  WSAData: TWSAData;
  p: PHostEnt;
  Name: array[0..$FF] of Char;
begin
  WSAStartup($0101, WSAData);
  GetHostName(name, $FF);
  p := GetHostByName(Name);
  showmessage(inet_ntoa(PInAddr(p.h_addr_list^)^));
  WSACleanup;
end;


Оксана (oksana@wtgres.pssr.ru)
Взято с сайта



Как узнать количество цветов в системной палитре?


Как узнать количество цветов в системной палитре?




function GetNumColors: LongInt;
var
  BPP: Integer;
  DC: HDC;
begin
  DC := CreateDC('DISPLAY', nil, nil, nil);
  if DC <> 0 then
    begin
      try
        BPP := GetDeviceCaps(DC, BITPIXEL) * GetDeviceCaps(DC, PLANES);
      finally
        DeleteDC(DC);
      end;
      case BPP of
        1: Result := 2;
        4: Result := 16;
        8: Result := 256;
        15: Result := 32768;
        16: Result := 65536;
        24: Result := 16777216;
      end;
    end
  else
    Result := 0;
end;



Как узнать количество видимых строчек в TMemo?


Как узнать количество видимых строчек в TMemo?



function LinesVisible(Memo: TMemo): integer; 
    Var 
      OldFont : HFont; 
      Hand : THandle; 
      TM : TTextMetric; 
      Rect  : TRect; 
      tempint : integer; 
    begin 
      Hand := GetDC(Memo.Handle); 
      try 
        OldFont := SelectObject(Hand, Memo.Font.Handle); 
        try 
          GetTextMetrics(Hand, TM); 
          Memo.Perform(EM_GETRECT, 0, longint(@Rect)); 
          tempint := (Rect.Bottom - Rect.Top) div 
             (TM.tmHeight + TM.tmExternalLeading); 
        finally 
          SelectObject(Hand, OldFont); 
        end; 
      finally 
        ReleaseDC(Memo.Handle, Hand); 
      end; 
      Result := tempint; 
    end; 

Взято с Исходников.ru



Как узнать конфигурацию железа?


Как узнать конфигурацию железа?



Вот компонент для этого нашел:



описание от авторов:

File: msi.zip
Product: MiTeC System Information Component
Version: 6.2
Author: MichaL MutL
E-Mail: michal.mutl@atlas.cz
Target: Delphi 5.x, Delphi 6.x
Platform: W95, W98, NT, W2000, Windows ME, Windows XP
Status: Fully Functional
Source: Included
Description: Component providing detailed system information
+ Registered organization, owner
+ Time Zone info
+ Machine name, IP address, MAC Address
+ Last boot date and time, Boot time
+ CPU architecture, type, active mask, count, level, revision, vendor, id, speed,
+ OS version, build number, platform, CSD version, version name, user name, serial number
+ DVD Region, folders
+ Graphic adapter chip name, dac, memory, screen width and height, color depth, modes
+ Sound card name, WaveIn, WaveOut, MIDIIn, MIDIOut, AUX, Mixer device name
+ Printers
+ Memory info, allocation granularity, min.and max.application address
+ Disk info, file system, controllers
+ BIOS name, copyright, extended info, date
+ Video BIOS version and date
+ Network adapter, protocols, sevices, clients,
+ Winsock info
+ BDE, ODBC, DAO, ADO version
+ DirectX info
+ Device overview (like Device Manager)
+ Win9x resources
+ Running process enumeration
+ Installed software enumeration
+ Startup runs enumeration
+ Performance Library interface (NT & 9x)
+ Internet settings
+ Sharepoints enumeration
+ Component showing CPU usage
Взято с Vingrad.ru




Почти все о железе можно прочитать из регистра по HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\

Автор ответа: Diamond cat
Взято с Vingrad.ru





Как узнать минимальные поля для принтера?


Как узнать минимальные поля для принтера?




uses 
  Printers; 

type 
  TMargins = record 
    Left, 
    Top, 
    Right, 
    Bottom: Double 
end; 

procedure GetPrinterMargins(var Margins: TMargins); 
var 
  PixelsPerInch: TPoint; 
  PhysPageSize: TPoint; 
  OffsetStart: TPoint; 
  PageRes: TPoint; 
begin 
  PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); 
  PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX); 
  Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize); 
  Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart); 
  PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES); 
  PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES); 
  // Top Margin 
  Margins.Top := OffsetStart.y / PixelsPerInch.y; 
  // Left Margin 
  Margins.Left := OffsetStart.x / PixelsPerInch.x; 
  // Bottom Margin 
  Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) - 
    (OffsetStart.y / PixelsPerInch.y); 
  // Right Margin 
  Margins.Right := ((PhysPageSize.x - PageRes.x) / PixelsPerInch.x) - 
    (OffsetStart.x / PixelsPerInch.x); 
end; 

function InchToCm(Pixel: Single): Single; 
// Convert inch to Centimeter 
begin 
  Result := Pixel * 2.54 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  Margins: TMargins; 
begin 
 GetPrinterMargins(Margins); 
 ShowMessage(Format('Margins: (Left: %1.3f, Top: %1.3f, Right: %1.3f, Bottom: %1.3f)', 
  [InchToCm(Margins.Left), 
   InchToCm(Margins.Top), 
   InchToCm(Margins.Right), 
   InchToCm(Margins.Bottom)])); 
end; 

Взято с сайта



Как узнать, находится ли дискета в дисководе?


Как узнать, находится ли дискета в дисководе?





type TDriveState(DS_NO_DISK, DS_UNFORMATTED_DISK,
    DS_EMPTY_DISK, DS_DISK_WITH_FILES);

function DriveState(DrvLetter: Char): TDriveState;
var Mask: string[6]; 
    SearchRec: TSearchRec;
    oldMode: Cardinal; ReturnCode: Integer;
begin 
  oldMode: = SetErrorMode(SEM_FAILCRITICALERRORS);
  Mask := '?:\*.*'; Mask[1] := DrvLetter; {$I-} { отключить обработку исключительных ситуаций }
  ReturnCode := FindFirst(Mask, faAnyfile, SearchRec);
  FindClose(SearchRec); {$I+} case ReturnCode of
   { как минимум один файл был найден }0: Result := DS_DISK_WITH_FILES;
   { файлов не найдено и дискета в порядке }-18: Result := DS_EMPTY_DISK;
   { DS_NO_DISK для DOS, ERROR_NOT_READY для WinNT,
                ERROR_PATH_NOT_FOUND для Win 3.1 }
    -21, -3: Result := DS_NO_DISK;
  else { дискета лежит в дисководе но она не форматировнная }
    Result := DS_UNFORMATTED_DISK; end;
  SetErrorMode(oldMode); end; { DriveState }

Взято с сайта



Как узнать, находится ли мышка на форме?


Как узнать, находится ли мышка на форме?



Для этого можно воспользоваться API функцией GetCapture().

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If GetCapture = 0 then
    SetCapture(Form1.Handle);
  if PtInRect(Rect(Form1.Left,
                   Form1.Top,
                   Form1.Left + Form1.Width,
                   Form1.Top + Form1.Height),
                   ClientToScreen(Point(x, y))) then
  Form1.Caption := 'Мышка на форме' else
  Form1.Caption := 'Мышка за пределами формы';
end;

Взято с Исходников.ru




Как узнать номер автоинкремента при вставке новой записи?


Как узнать номер автоинкремента при вставке новой записи?





We have a table in MsAccess like :

Test, Fields (id=autoinc, name=text);

First we have to have a function like the one below :

functionGetLastInsertID: integer;
begin
  // datResult = TADODataSet
  datResult.Active := False;
  datResult.CommandText := 'select @@IDENTITY as [ID]';
  datResult.Active := True;
  Result := datResult.FieldByName('id').AsInteger;
  datResult.Active := False;
end;

Now before getting the last inserted record record id = autoincrement field, in other words calling the above function. You have to do a SQL insert like the following

procedure InsertRec;
begin
  // datCommand = TADOCommand
  datCommand.CommandText := 'insert into [test] ( [name] ) values ( "Test" )';
  datCommand.Execute;
end;

Now if we like to know which is the last autoinc value ( notice that the getlastinsertid proc. only works after the insertrec proc)

procedure Test;
begin
  InsertRec;
  Showmessage(format('lastinsertid : %d', [GetLastInsertID]));
end;

Hope you can make this work, it works for me, any questions feel free to ask


Взято с

Delphi Knowledge Base