nyuuzyou/wikis huggingface dataset:
CreateProcess, который возвращает консольный вывод

=== CreateProcess, который возвращает консольный вывод ===
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors: TStringList);
var
 sa: TSECURITYATTRIBUTES;
 si: TSTARTUPINFO;
 pi: TPROCESSINFORMATION;
 hPipeOutputRead: THANDLE;
 hPipeOutputWrite: THANDLE;
 hPipeErrorsRead: THANDLE;
 hPipeErrorsWrite: THANDLE;
 Res, bTest: Boolean;
 env: array[0..100] of Char;
 szBuffer: array[0..256] of Char;
 dwNumberOfBytesRead: DWORD;
 Stream: TMemoryStream;
begin
 sa.nLength := SizeOf(sa);
 sa.bInheritHandle := True;
 sa.lpSecurityDescriptor := nil;
 CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
 CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
 ZeroMemory(@env, SizeOf(env));
 ZeroMemory(@si, SizeOf(si));
 ZeroMemory(@pi, SizeOf(pi));
 si.cb := SizeOf(si);
 si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
 si.wShowWindow := SW_HIDE;
 si.hStdInput := 0;
 si.hStdOutput := hPipeOutputWrite;
 si.hStdError := hPipeErrorsWrite;
 (* Remember that if you want to execute an app with no parameters you nil the
 second parameter and use the first, you can also leave it as is with no
 problems. *)
 Res := CreateProcess(nil, PChar(CommandLine), nil, nil, True,
 CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);
 // Procedure will exit if CreateProcess fail
 if not Res then
 begin
 CloseHandle(hPipeOutputRead);
 CloseHandle(hPipeOutputWrite);
 CloseHandle(hPipeErrorsRead);
 CloseHandle(hPipeErrorsWrite);
 Exit;
 end;
 CloseHandle(hPipeOutputWrite);
 CloseHandle(hPipeErrorsWrite);
 // Read output pipe
 Stream := TMemoryStream.Create;
 try
 while True do
 begin
 bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil);
 if not bTest then
 begin
 break;
 end;
 Stream.Write(szBuffer, dwNumberOfBytesRead);
 end;
 Stream.Position := 0;
 Output.LoadFromStream(Stream);
 finally
 Stream.Free;
 end;
 // Read error pipe
 Stream := TMemoryStream.Create;
 try
 while True do
 begin
 bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead, nil);
 if not bTest then
 begin
 break;
 end;
 Stream.Write(szBuffer, dwNumberOfBytesRead);
 end;
 Stream.Position := 0;
 Errors.LoadFromStream(Stream);
 finally
 Stream.Free;
 end;
 WaitForSingleObject(pi.hProcess, INFINITE);
 CloseHandle(pi.hProcess);
 CloseHandle(hPipeOutputRead);
 CloseHandle(hPipeErrorsRead);
end;
(* got it from yahoo groups, so no copyrights for this piece :p and and example
 of how to use it. put a button and a memo to a form. *)
procedure TForm1.Button1Click(Sender: TObject);
var
 OutP: TStringList;
 ErrorP: TStringList;
begin
 OutP := TStringList.Create;
 ErrorP := TstringList.Create;
 ExecConsoleApp('ping localhost', OutP, ErrorP);
 Memo1.Lines.Assign(OutP);
 OutP.Free;
 ErrorP.Free;
end;
ID: 02182
Create a TWebBrowser at Runtime?

procedure TForm1.Button1Click(Sender: TObject);
var
 wb: TWebBrowser;
begin
 wb := TWebBrowser.Create(Form1);
 TWinControl(wb).Name := 'MyWebBrowser';
 TWinControl(wb).Parent := Form1;
 wb.Align := alClient;
 // TWinControl(wb).Parent := TabSheet1; ( To put it on a TabSheet )
 wb.Navigate('http://www.swissdelphicenter.ch');
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03460
Category:Связь
Category:WebBrowser
Creating resource files

=== Creating resource files ===
You can use the Borland Command Line Resource Compiler (BRCC.EXE and BRCC32.EXE) that ships with Delphi and C++ Builder, or a WYSIWYG resource editor such as Borland's Resource Workshop 5.0 that ships with the Borland RAD Pack. The Resource Workshop 5.0 can compile and decompile both 16 and 32 bit resources from .rc, .res, .exe, .dll, .drv, .vbx, .cpl, .ico,. bmp, .rle, .dlg, fnt, and cur files.
ID: 02161
CrtSock - модуль для работы с сокетами в Delphi32

WEB-сайт: www.multimania.com/tothpaul
CrtSock. Модуль для работы с сокетами.
* Совместимость: Delphi 2+
* Поддерживает TCP и UDP пакеты.
* Не использует winsock.pas, поскольку обращается непосредственно к wsock32.dll.
* Набор функций позволяет разрабатывать как клиентские, так и серверные приложения.
Перечень включенных в модуль функций:
// Server side :
// - start a server
// - wait for a client
function StartServer(Port: Word): Integer;
function WaitClient(Server: Integer): Integer;
function WaitClientEx(Server: Integer; var ip: string): Integer;
// Client side :
// - call a server
function CallServer(Server: string; Port: Word): Integer;
// Both side :
// - Assign CRT Sockets
// - Disconnect server
procedure AssignCrtSock(Socket: Integer; var Input, Output: TextFile);
procedure Disconnect(Socket: Integer);
// BroadCasting (UDP)
function StartBroadCast(Port: Word): Integer;
function SendBroadCast(Server: Integer; Port: Word; s: string): Integer;
function SendBroadCastTo(Server: Integer; Port: Word; ip, s: string): Integer;
function ReadBroadCast(Server: Integer; Port: Word): string;
function ReadBroadCastEx(Server: Integer; Port: Word; var ip: string): string;
// BlockRead
function SockAvail(Socket: Integer): Integer;
function DataAvail(var F: TextFile): Integer;
Function BlockReadsock(var F: TextFile; var s: string): Boolean;
function send(socket: Integer; data: Pointer; datalen, flags: Integer): Integer; stdcall; far;
function recv(socket: Integer; data: PChar; datalen, flags: Integer): Integer; stdcall; far;
Дополнительно в комплект входят модули для работы с FTP, HTTP, SMTP, POP3.
В качестве примера приведена демонстрационная программа, использующая все эти возможности.
* Crtsock.pas
* Ftpsock.pas
* Httpsock.pas
* Popsock.pas
* Smtpsock.pas
Author: Paul Toth
Source: http://delphiworld.narod.ru
ID: 03558
Category:Связь
Category:Сокеты
Cколько файлов есть в определённой папке?

=== Cколько файлов есть в определённой папке? ===
Как наиболее быстрым способом узнать, сколько файлов с определенным расширением есть в определенной папке?
Например для HTM файлов:
function GetFileCount(Dir: string): Integer;
var
 fs: TSearchRec;
begin
 Result := 0;
 if FindFirst(Dir + '\*.htm', faAnyFile - faDirectory - faVolumeID, fs) = 0 then
 repeat
 Inc(Result);
 until FindNext(fs) <> 0;
 FindClose(fs);
end;
Author: Vit
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 03156
Category:Файловая система
Cписок зарезервированных слов Local SQL BDE

=== Cписок зарезервированных слов Local SQL BDE ===
 ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING,
 AT, AUTO, AUTOINC, AVG
 
 BASE_NAME, BEFORE, BEGIN, BETWEEN, BLOB, BOOLEAN, BOTH, BY,
 BYTES
 
 CACHE, CAST, CHAR, CHARACTER, CHECK, CHECK_POINT_LENGTH,
 COLLATE, COLUMN, COMMIT, COMMITTED, COMPUTED, CONDITIONAL,
 CONSTRAINT, CONTAINING, COUNT, CREATE, CSTRING, CURRENT,
 CURSOR
 
 DATABASE, DATE, DAY, DEBUG, DEC, DECIMAL, DECLARE, DEFAULT,
 DELETE, DESC, DESCENDING, DISTINCT, DO, DOMAIN, DOUBLE, DROP
 
 ELSE, END, ENTRY_POINT, ESCAPE, EXCEPTION, EXECUTE, EXISTS,
 EXIT, EXTERNAL, EXTRACT
 
 FILE, FILTER, FLOAT, FOR, FOREIGN, FROM, FULL, FUNCTION
 
 GDSCODE, GENERATOR, GEN_ID, GRANT, GROUP,
 GROUP_COMMIT_WAIT_TIME
 
 HAVING, HOUR
 
 IF, IN, INT, INACTIVE, INDEX, INNER, INPUT_TYPE, INSERT,
 INTEGER, INTO, IS, ISOLATION
 
 JOIN
 
 KEY
 
 LONG, LENGTH, LOGFILE, LOWER, LEADING, LEFT, LEVEL, LIKE,
 LOG_BUFFER_SIZE
 
 MANUAL, MAX, MAXIMUM_SEGMENT, MERGE, MESSAGE, MIN, MINUTE,
 MODULE_NAME, MONEY, MONTH
 
 NAMES, NATIONAL, NATURAL, NCHAR, NO, NOT, NULL,
 NUM_LOG_BUFFERS, NUMERIC
 
 OF, ON, ONLY, OPTION, OR, ORDER, OUTER, OUTPUT_TYPE, OVERFLOW
 
 PAGE_SIZE, PAGE, PAGES, PARAMETER, PASSWORD, PLAN, POSITION,
 POST_EVENT, PRECISION, PROCEDURE, PROTECTED, PRIMARY,
 PRIVILEGES
 
 RAW_PARTITIONS, RDB$DB_KEY, READ, REAL, RECORD_VERSION,
 REFERENCES, RESERV, RESERVING, RETAIN, RETURNING_VALUES,
 RETURNS, REVOKE, RIGHT, ROLLBACK
 
 SECOND, SEGMENT, SELECT, SET, SHARED, SHADOW, SCHEMA,
 SINGULAR, SIZE, SMALLINT, SNAPSHOT, SOME, SORT, SQLCODE,
 STABILITY, STARTING, STARTS, STATISTICS, SUB_TYPE, SUBSTRING,
 SUM, SUSPEND
 
 TABLE, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
 TO, TRAILING, TRANSACTION, TRIGGER, TRIM
 
 UNCOMMITTED, UNION, UNIQUE, UPDATE, UPPER, USER
 
 VALUE, VALUES, VARCHAR, VARIABLE, VARYING, VIEW
 
 WAIT, WHEN, WHERE, WHILE, WITH, WORK, WRITE
 
 YEAR
 
 ||, -, *, /, <>, <, >, ,(comma), =, <=, >=, ~=, !=, ^=, (, )
Source: Взято с сайта http://www.delphikingdom.ru/
ID: 02501
Category:Справочники
Cуществует ли диск в системе?

=== Cуществует ли диск в системе? ===
function DriveExists(Drive: Byte) : boolean;
begin
 Result := Boolean (GetLogicalDrives and (1 shl Drive));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 Drive: Byte;
begin
 for Drive := 0 to 25 do
 if DriveExists(Drive) then
 begin
 ListBox1.Items.Add(Chr(Drive+$41));
 end;
end;
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01370
DBFSeek и DBFLocate

=== DBFSeek и DBFLocate ===
Надежней и намного быстрее (если вы ищите отдельные записи) выполнить поиск строки с помощью Seek (если найдена первая запись), или выполнить Locate (индекс не требуется)
например
Table1.UpdateCursorPos;
if DBFSeek(Table1, xVal1) then { _не_ delphi-функция - смотри ниже }
begin
 if DBFLocate(Table1, 'CUSTNAME', xVal2) then { _не_ delphi-функция - модификация из faq }
 begin
 //... делаем все, что необходимо
 end;
end;
P.S.
* DBFLocate - модифицированная из faq фунция fieldname
* DBFSeek - функция, найденная методом проб и ошибок! - значительно лучшая (IMHO) чем setkey...fieldbyname1...fieldbyname2...gotokey, используемые для выражений индексов dBase за первым полем. Вы можете использовать FindKey для dBase индексов, состоящих из одного поля, вопреки мнению других участников форума.
{============================================================
{ DBFSeek
{ поиск величины с использованием индекса - простой путь
{============================================================}
function DBFSeek(const Table1: TTable; const sValue: string): boolean;
var
 sExpValue: DBIKEYEXP;
 bmPos: TBookMark;
 nOrder: Integer;
begin
 Result := False;
 with Table1 do
 begin
 if (Active) and (Length(IndexName) > 0) then
 begin
 bmPos := GetBookMark;
 DisableControls;
 StrPCopy(sExpValue, sValue);
 if (DbiGetRecordForKey(Handle, True, 0, StrLen(sExpValue), @sExpValue, nil) = DBIERR_NONE) then
 Result := True
 else
 GotoBookMark(bmPos);
 FreeBookMark(bmPos);
 EnableControls;
 end;
 end;
end;
{==================================================================================
{ DBFLocate
{ поиск величины, не связанный с ключевым полем
{ замена из faq, теперь акцептует fieldname, величина может быть частичной
{================================================================================}
function DBFLocate(const Table1: TTable; const sFld, sValue: string): boolean;
var
 bmPos: TBookMark;
 bFound: Boolean;
 len: Integer;
begin
 Result := False;
 if (not StrEmpty(sValue)) and (not StrEmpty(sFld)) then
 begin
 with Table1 do
 begin
 DisableControls;
 bFound := False;
 bmPos := GetBookMark;
 len := Length(sValue);
 First;
 while not EOF do
 begin
 if FieldByName(sFld).AsString <> sValue then
 Next
 else
 begin
 Result := True;
 bFound := True;
 Break;
 end;
 end;
 if (not bFound) then
 GotoBookMark(bmPos);
 FreeBookMark(bmPos);
 EnableControls;
 end;
 end;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 02713
DBGrid - сохранение конфигурации

=== DBGrid - сохранение конфигурации ===
Нижеописанный код создает, сохраняет и загружает конфигурационный файл и изменяет размеры столбцов таблицы DBGRID
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, DBGrids, Db, DBTables, StdCtrls, IniFiles;
procedure TMainForm.NewIni(const NomeIni: string);
var
 F: System.Text;
 i: Byte;
begin
 System.Assign(F, NomeIni);
 System.ReWrite(F);
 System.WriteLn(F, '[Campi_Ordine]');
 for i:=1 to Table1.FieldCount do
 System.WriteLn(F, 'Campo', i, '=', Table1.Fields[i-1].FieldName);
 System.WriteLn(F, );
 System.WriteLn(F, '[Campi_Size]');
 for i:=1 to Table1.FieldCount do
 System.WriteLn(F, 'Campo', i, '=', Table1.Fields[i-1].DisplayWidth);
 System.Close(F);
end;
procedure TMainForm.SaveIni(const FN: string);
var
 Ini: TIniFile;
 i: Integer;
 S : string;
begin
 NewIni(FN);
 Ini := TIniFile.Create(FN);
 with Ini do begin
 for i:=1 to Table1.FieldCount do
 begin
 S := Table1.Fields[i-1].FieldName;
 WriteString('Campi_Ordine', 'Campo' + IntToStr(i),
 Table1.Fields[i-1].FieldName);
 WriteInteger('Campi_Size', 'Campo' + IntToStr(i),
 Table1.Fields[i-1].DisplayWidth);
 end;
 end;
 Ini.Free;
end;
procedure TMainForm.LoadIni(const FN: string);
var
 Ini: TIniFile;
 i: Integer;
 j: Longint;
 S: string;
 function MyReadInteger(const Section, Ident: string): Longint;
 begin
 result := Ini.ReadInteger(Section, Ident, -1);
 if result = -1 then
 raise Exception.Create('Errore nel file di configurazione.');
 end;
 function MyReadString(const Section, Ident: string): string;
 begin
 result := Ini.ReadString(Section, Ident, );
 if result = then
 raise Exception.Create('Errore nel file di configurazione.');
 end;
begin
 Ini := TIniFile.Create(FN);
 try
 with Ini do
 begin
 for i:=1 to Table1.FieldCount do
 begin
 S := MyReadString('Campi_Ordine', 'Campo' + IntToStr(i));
 j := MyReadInteger('Campi_Size', 'Campo' + IntToStr(i));
 Table1.FieldByName(S).Index := i-1;
 Table1.FieldByName(S).DisplayWidth := j;
 end;
 end;
 finally
 Ini.Free;
 end;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 03064
Category:Базы данных
Category:DBGrid
DBGrid CutToClipboard

=== DBGrid CutToClipboard ===
Внутри TDBGrid "зашит" защищенный (protected) элемент управления типа TInPlaceEdit, потомок TCustomMaskEdit. Данный элемент управляется комбинацией клавиш [Shift]+[Ins] и [Shift]+[Del]. Но для нас не существует способа оперировать элементом, поскольку он является защищенным членом.
Да, но вы можете сделать это обманным путем. Попробуйте так:
procedure TForm1.Paste1Click(Sender: TObject);
begin
 SendMessage(GetFocus, WM_PASTE, 0, 0);
end;
procedure TForm1.Copy1Click(Sender: TObject);
begin
 SendMessage(GetFocus, WM_COPY, 0, 0);
end;
Эти методы привязаны к вашим пунктам меню. Они посылают сообщение окну с текущим фокусом. Если это элемент управления TInPlaceEdit, то мы добились того, чего хотели.
Source: Взято с http://delphiworld.narod.ru
ID: 03052
Category:Базы данных
Category:DBGrid
DBGrid DefaultDrawDataCell

=== DBGrid DefaultDrawDataCell ===
TDBGrid имеет недокументированный в электронной справке метод DefaultDrawDataCell.
Вот пример его использования:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;
 const Rect: TRect; Field: TField; State: TGridDrawState);
begin
 with Sender as TDBGrid do
 begin
 Canvas.Font.Color := clRed;
 DefaultDrawDataCell(Rect, Field, State);
 end;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 03053
Category:Базы данных
Category:DBGrid
DBGrid с номером строки

=== DBGrid с номером строки ===
unit RowGrid;
interface
uses
 WinTypes, WinProcs, Classes, Grids, DBGrids;
type
 TRowDBGrid = class(TDBGrid)
 public
 property Row;
 property RowCount;
 property VisibleRowCount;
 end;
procedure Register;
implementation
procedure Register;
begin
 RegisterComponents('Data Controls', [TRowDBGrid]);
end;
end.
вот небольшой испытательный демо-проект.. мы поместили на форму нашу сетку-наследницу, 3 компонента EditBox и поместили следующий код в обработчик события OnDrawDataCell вашего TRowGrid
procedure TForm1.RowDBGrid1DrawDataCell(Sender: TObject; const Rect:
 TRect; Field: TField; State: TGridDrawState);
begin
 eb_row.Text := IntToStr(rowdbgrid1.Row);
 eb_rowcount.Text := IntToStr(rowdbgrid1.RowCount);
 eb_visiblerowcount.Text := IntToStr(rowdbgrid1.VisibleRowCount);
end;
Source: Взято с http://delphiworld.narod.ru
ID: 03070
Category:Базы данных
Category:DBGrid
DBNavigator без иконок

=== DBNavigator без иконок ===
var
 c: shortint;
 s: string;
begin
 s := 'A';
 with DBNavigator1 do
 for c := 0 to ControlCount - 1 do
 if Controls[c] is TNavButton then
 with TNavButton(Controls[c]) do
 begin
 ListBox1.Items.Add(Name);
 Glyph := nil;
 Caption := s;
 Inc(s[1]);
 end;
end;
ID: 03087
Category:Базы данных
Category:DBNavigator
DDE - передача текста

Вот я как работаю с Excel:
type
 DDEClientConv1.SetLink('Excel', 'Sheet1');
try
 DDEClientConv1.OpenLink;
 DDEClientItem1.DDEItem := 'R1C1';
 DDEClientConv1.PokeData(DDEClientItem1.DDEItem, StrPCopy(P, SomeString)));
finally
 DDEClientConv1.CloseLink;
end;
Как вы можете здесь видеть, свойство DDEItem определяется сервером. Если ваш сервер является приложением Delphi, то DDEItem - имя DDEServerItem. На вашем месте я бы не стал так долго заниматься отладкой DDE-программ. Воспользуйтесь синхронизацией, позволяющей понять при отладке правильность действий
Source: http://delphiworld.narod.ru/
ID: 04496
Category:DDE
DDE для вызова диалога поиска файлов и папок

uses DdeMan;
procedure TForm1.Button1Click(Sender: TObject);
begin
 with TDDEClientConv.Create(Self) do
 begin
 ConnectMode := ddeManual;
 ServiceApplication := 'explorer.exe';
 SetLink('Folders', 'AppProperties');
 OpenLink;
 ExecuteMacro('[FindFolder(, C:\Мои документы)]', False);
 CloseLink;
 Free;
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 04497
Category:Файловая система
Category:DDE
DDE для захвата текущего URL из окна Internet Explorer или Netscape Navigator

uses
 windows, ddeman;
function Get_URL(Servicio: string): string;
var
 Cliente_DDE: TDDEClientConv;
 temp: PChar; // <<-------------------------This is new
begin
 Result := ;
 Cliente_DDE := TDDEClientConv.Create(nil);
 with Cliente_DDE do
 begin
 SetLink(Servicio, 'WWW_GetWindowInfo');
 temp := RequestData('0xFFFFFFFF');
 Result := StrPas(temp);
 StrDispose(temp); // <<-- Предотвращаем утечку памяти
 CloseLink;
 end;
 Cliente_DDE.Free;
end;
procedure TForm1.Button1Click(Sender);
begin
 ShowMessage(Get_URL('Netscape'));
 // или
 ShowMessage(Get_URL('IExplore'));
end;
ID: 04498
Category:DDE
DLL и ресурсы

=== DLL и ресурсы ===
...я также имею проблемы с другими функциями DLL, которые ведут себя иначе, чем при первом обращении к ним! 
Недавно я и сам закончил большой "DLL-проект", в котором столкнулся с аналогичными проблемами. Я не знаком с вашим специфическим исключением, которое вы упомянули, но я могу предложить некоторые общие советы по поводу использования DLL. 
Главное, что нужно помнить при разработке DLL - вы не должны допускать ситуацию, при которой любое исключение осталось бы неперехваченным (спасибо Pat Ritchey за столь мудрый совет). В теле экспортируемых функций "заверните" все в блоки try..except (которые замечательно обрабатываются Delphi). 
Далее, любые ресурсы, которые вы явно создаете при открытии DLL, должны создаваться в обработчике FormCreate (а не в секции Initialization) и освобождаться в обработчике FormClose. Мне кажется, что при вызове DLL (и использовании ее для распределения ресурсов) они не полностью освобождается до тех пор, пока вызывающее приложение не будет закрыто, а при вторичном вызове DLL не перегружается (это мои наблюдения, но, похоже, они верны). По всей видимости, ресурсы, освобожденные в первый раз, во время второго вызова не пересоздаются. У меня была масса проблем до тех пор, пока в коде я не определил "нужное место" для освобождения ресурсов. Но после того, как я переместил работу с ресурсами в обработчики событий FormCreate и FormClose, GPF исчезли. 
Кроме того, для освобождения ресурсов вы должны вместо метода Close или Free использовать метод Release. 
Ну и последний совет: вы должны быть очень осторожными при создании и освобождении ресурсов в DLL и подходить к вопросу программирования очень тщательно. Delphi может простить такую ошибку в EXE, но не в DLL. 
Надеюсь я помог вам.
Source: Взято с http://delphiworld.narod.ru
ID: 01996
DLL со строковыми ресурсами

=== DLL со строковыми ресурсами ===
Делаешь текстовый файл с ресурсами, типа
--my.rc--
 STRINGTABLE
 {
 00001, "My String #1"
 00002, "My String #2"
 }
Далее компилируешь его:
 brcc32 my.rc
У тебя получится my.res. 
Делаешь DLL: 
--my.dpr--
library my;
{$R my.res}
begin
end.
Компилируешь Дельфиским компилятором:
 dcc32 my.dpr
Получаешь, наконец-то свою my.dll 
Теперь о том, как использовать. 
В своей программе:
var
 h: THandle;
 S: array [0..255] of Char;
begin
 h := LoadLibrary('MY.DLL');
 if h <= 0 then 
 ShowMessage('Bad Dll Load')
 else
 begin
 SetLength(S, 512);
 LoadString(h, 1, @S, 255);
 FreeLibrary(h);
 end;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 02001
DOC в HTML

var
 fname: string;
 WordAppl, WordDoc: OleVariant;
begin
 with TOpenDialog.Create(nil) do
 try
 Filter := 'word documents (*.doc)|*.doc';
 if not Execute then Exit;
 fname := FileName;
 finally
 Free;
 end;
 WordAppl := CreateOleObject('Word.Application');
 try
 WordDoc := WordAppl.Documents.Open(fname);
 fname := ExtractFilePath(fname) + 'test.htm';
 WordDoc.SaveAs(FileName := fname, FileFormat := wdFormatHTML);
 finally
 WordAppl.Quit;
 end;
end;
Author: jack128
Source: http://forum.sources.ru
ID: 04282
Category:Конвертация
DXPlay

Многие игры в нынешнее время поддерживают мультиплеер, почему? Потому что сейчас люди уже перестали довольствоваться AI, который играет в частности 'линейно', его нельзя обмануть, пошутить над его действиями или разозлить... =) С ним играть можно только на уровне обучения игры, а далее - сеть, живые игроки… ;). Если это маленькое вступление заставило вас захотеть добавить в свою игру мультиплеер то эта статья для вас. Итак, сразу к делу. Сделаем самую легкую программу, с одной кнопкой. =) Кидаем ее на форму, не забыв кинуть DXPlay. В этой программе давайте сделаем что бы форма подключения DXPlay выводилась при запуске. Идем в настройки DXPlay и устанавливаем любой Guid путем нажатия кнопки New, этот параметр (imho) "устанавливает" уникальности вашему мультиплееру. Далее так: TForm1 -> Events -> OnCreate, и в процедуру кидаем:
try
 DXPlay1.Open; // Пытаемся открыть форму подключения
except
 on E: Exception do
 begin
 Application.ShowMainForm := False;
 Application.HandleException(E);
 Application.Terminate; // Если не подключаемся или ошибка выходим их программы
 end;
end;
Теперь при запуске программы у вас будет выводится форма DXPlay. После:
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DXPlay;
Пишем:
const
 DXMESE = 1;
type
 TDXMessage = record
 MessageType: DWORD; // Тип сообщения
 Mes: Integer; // Тип пересылаемых данных, может быть несколько, к примеру - Mes2: String;
 end;
Далее, кликаем два раза на кнопку, создавая тем самым процедуру нажатия кнопки, и пишем туда:
var
 Msg: ^TDXMessage; // Ссылаемся на TDXMessage
 MsgSize: Integer; // Размер сообщения
begin
 MsgSize := SizeOf(TDXMessage); // Нужно узнать размер сообщения.
 GetMem(Msg, MsgSize);
 try
 Msg.MessageType := DXMESE; // Указываем тип сообщения
 Msg.Mes := Random(100); { Само сообщения, может быть что угодно, вплоть до нахождения курсора мышки }
 DXPlay1.SendMessage(DPID_ALLPLAYERS, Msg, MsgSize); // Отправляем мессагу всем игрокам
 DXPlay1.SendMessage(DXPlay1.LocalPlayer.ID, Msg, MsgSize); // Отправляем себе
 finally
 FreeMem(Msg); // Освобождаем память сообщения Msg
 end;
end;
Для приема делаем следующее - DXPlay1 -> Events -> OnMessage и пишем :
Button1.Left := TDXMessage(Data^).Mes; { Устанавливаем положения кнопки по горизонтали в соответствии с полученным числом }
Button1.Caption := IntToStr(TDXMessage(Data^).Mes); // Пишем это число
Итак, это уже конец, осталось чуть-чуть:
В процедуре уничтожения формы (FormDestroy) (TForm1 -> Events -> OnDestroy) пишем:
DXPlay1.Close; // Завершение подключения DXPlay.
И последний штрих - В units добавляем DirectX.
Все, запускаем и радуемся нашей первой программе с мультиплеером! =)
Author: SDil
Source: http://daddy.mirgames.ru
ID: 03926
Category:Графика
Category:DirectX
Data segment too large error

=== Data segment too large error ===
When I add a large number of typed constants to my application, my data segment grows too large. How can I get around this?
Typed constants are added to the Program's data segment. Untyped constants are added to the code segment of the application only if they are used. Unless you are going to reassign the value of a typed constant, you should use an untyped constant instead. Typed constants should be replaced with initialized variables to be compatible with future versions of the compiler.
Example:
{This adds the constant to the data segment}
const SomeTypedString : string = 'Test';
const SomeTypedInt : integer = 5;
{This adds the constant to the code segment if used}
const SomeUnTypedString = 'Test';
const SomeUnTypedInt = 5;
ID: 00016