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

Все, что вы не знали, но хотели бы узнать о Delphi. Язык программирования Delphi


Выпуск №3

Раздел: Язык Программирования Delphi

В связи с небольшим количеством поступивших писем я решил идти по порядку.

Уважаемый подписчик,

О чем будет следующий раздел - решать вам.

Варианты:

VCL

Системные функции и Winapi

Базы данных

Работа с файловой системой

Репортинг, работа с принтером

Работа с сетью, Интернетом, протоколами

Работа с графикой, мультимедиа

Ваши предложения высылайте на

formyreferal@rambler.ru

В этом выпуске:

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

Быстрый способ обмена значений в 2х переменных.

BEEP для Дельфи, который работает, как в TP

Как передать массив как параметр?

Можно ли задать шаг в For?

Как сделать procedure/function с переменным количеством параметров?

Функция, возвращающая тип

Взять один символ из потока памяти

Удобная функция ifthen

Использование PosEx взамен Pos

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

 

 

Paramcount - показывает, сколько параметров передано
Paramstr(0) - это имя с путем твоей программы
Paramstr(1) - имя первого параметра
Paramstr(2) - имя второго параметра и т.д.

Если ты запускаешь:

с:\myprog.exe /a -b22 c:\dev

то Paramcount будет равен 3
Paramstr(0) будет равен с:\myprog.exe
Paramstr(1) будет равен /a
Paramstr(2) будет равен -b22
Paramstr(3) будет равен c:\dev


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

Например, у тебя возможно 3 параметра:

Если параметр = "/v" то выдать сообщение, если параметр "/c" то покрасить форму в синий цвет, если параметр "/f" - поменять заголовок формы:

if paramstr(1) = '/v' then
  showmessage(
'Parameter "/vwas found!');
if paramstr(1) = '/c' then
  color :clBlue;
if paramstr(1) = '/f' then
  caption := 
'Parameter "/fwas found';

Поставь этот код на событие формы onActivate, откомпилируй и попробуй запустить программу с одним из 3х указанных параметров и ты увидишь что произойдет.



Функция FindCmdLineSwitch (const Switch: string;SwitchChars: TSysCharSet;IgnoreCase: Boolean ): Boolean;
type TSysCharSet = set of Char;

Функция определяет, была ли передана приложению в качестве параметра командной строки строка Switch. Параметр IgnoreCase указывает должен ли учитываться регистр. Параметр SwitchChars идентифицирует допустимые символы-разделители (например, "-", "/").

Быстрый способ обмена значений в 2х переменных.

 


var 
 X1, X2: Byte; 
begin 
 X1 := X2 
xor X2;  
 X2 := X1 
xor X2; // X2 = X1 
 X1 := X1 
xor X2; // X1 = X2 

 

BEEP для дельфи, который работает, как в TP

 


BEEP , для Дельфи, который работает, как в B.Pascal 7.0

Я применяю следующий код, однако он работает только под Win9x/me
(Под WinNT/2000/XP вы можете использовать Beep(Tone, Duration)
- задавать тон и продолжительность звучания).

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($61Word(B or 3));  

 

 

SetPort($43$B6);  

 

 

 

 

 

end;   

 

 

 

 

 

SetPort($42Freq);  

 

 

SetPort($42Freq shr 8);  

 

 

 

 

 

end;  

 

 

 

end

procedure NoSound;
  var Value: Word;
begin 

 

Value :GetPort($61and $FC;  

 

 

SetPort($61Value);  

 

 

 

end

procedure SetPort(address, Value:Word);
  var bValue: byte;
begin 

 

bValue :trunc(Value and 255);  

 

 

asm  

 

 

  mov dxaddress  

 

 

  mov albValue  

 

 

  out dxal  

 

 

end;  

 

 

 

end

function GetPort(address:word):word;
var bValue: byte;
begin 

 

asm  

 

 

  mov dxaddress  

 

 

  in aldx  

 

 

  mov bValueal  

 

 

end;  

 

 

 

GetPort :bValue;
end;

Как передать массив как параметр?

 


Передача параметров в Дельфи:

Type Ta=array of something;
Var a:Ta;

Procedure Proc(a:
Ta); -
внутри процедуры создаётся копия массива, внутри процедуры работа осуществляется только с копией данных

Procedure Proc(var a:Ta); - внутри процедуры код работает именно с переменной а и её содержимым

Procedure Proc(const a:Ta); - внутри процедуры запрещено изменять данные переменной а

Procedure Proc(out a:Ta); - при входе в процедуру массив рассматривается как пустой, но после выполнения процедуры можно получить значения

Можно ли задать шаг в For?

 

Можно, немного дописав:
For i:=0 to Maximum do if i mod step = 0 then
begin

end

Как сделать procedure/function с переменным количеством параметров?

 


{ .... }

type
  VA_FN = 
function(const par1, par2{, ...}: Pointer): Boolean;
                   
cdecl varargs;

{ .... }

//
// varargs without "external" keyword
//
function fn(const par1, par2{, ...}: Pointer): Boolean; cdecl;
var
  last_arg: Pointer 
absolute par2;
  ptr_args
array[0..MAXLONG shr 2of Pointer absolute last_arg;
  dw_args
array[0..MAXLONG shr 2of Cardinal absolute last_arg;
  s_args
array[0..MAXLONG shr 2of PChar absolute last_arg;
  w_args
array[0..MAXLONG shr 2of WideString absolute last_arg;
begin
  
// ptr_args[1] is first optional argument
  Result := (ptr_args[
1{par3} = Pointer(1)) and
    (dw_args[
2{par4} = 2and
    (
string(ptr_args[3]) = 'CHAR'and
    (w_args[
4] = 'WCHAR');
end;

procedure test_fn;
begin
  
// VA_FN typecast
  VA_FN(@fn)(
{par1}nil{par2}nil{par3}Pointer(1), {par4}2{par5}'CHAR',
    
{par6}WideString('WCHAR'));
end;

Функция, возвращающая тип

 


// функция Chameleon, возвращающая тип сгенерированного исключения

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type
  MyBoolean = 
class
  
public
    Value: boolean;
  
end;

  MyInteger = 
class
  
public
    Value: integer;
  
end;

  MyClass = 
class
  
public
    Value: TStrings;
  
end;

  TForm1 = 
class(TForm)
    Button1: TButton;
    
procedure Button1Click(Sender: TObject);
  
private
    
{ Private declarations }
  
public
    
{ Public declarations }
    
procedure MyProc;
    
function Chameleon: boolean;
  
end;

var

  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.Chameleon: boolean;
var
  b: MyBoolean;
  iMyInteger;
  c: MyClass;
  r: integer;
begin
  r := Random(
3);
  
case r of
    
0:
      
begin
        b := MyBoolean.Create;
        
raise b;
      
end;
    
1:
      
begin
        i := MyInteger.Create;
        
raise i;
      
end;
    
2:
      
begin
        c := MyClass.Create;
        
raise c;
      
end;
  
end;
end;

procedure TForm1.MyProc;
begin
  
try
    Chameleon;
  
except
    on MyBoolean 
do
      ShowMessage(
'Функция возвратила класс MyBoolean');
    on MyInteger 
do
      ShowMessage(
'Функция возвратила класс MyInteger');
    on MyClass 
do
      ShowMessage(
'Функция возвратила класс MyClass');
  
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chameleon;
end;

end.

Взгляните на тип данных Variant в D2: следующий код

function AnyType(const TypeParm: integer): Variant;
begin
  
case TypeParm of
    
1Result := 1;
    
2: Result := 2.0;
    
3: Result := 'Три';
    
4: Result := StrToDate('4/4/1944');
  
end;
end;


Удобная функция ifthen

 


В Дельфи 6 (модуль Math) появилась удобная функция ifthen

пример:

procedure TForm1.Button1Click(Sender:
 TObject);
var k, i, j: Integer;
begin
  i := 3; j := 2;
  k := ifthen({If}i < j, {Then}i, {Else}k);
End;

Использование PosEx взамен Pos

 


В Delphi 7 в модуле StrUtils внесены некоторые изменения.
Есть новая функция: PosEx.

Объявление этих функций:

Function Pos(Substr: String; S: String): Integer;
Function PosEx(Const SubStr, S:
 StringOffsetCardinal = 1): Integer;

Новая функция PosEx, позволяет указать начальную позицию поиска внутри строки, что избавит вас от необходимости изменения
исходной строки. Не
забудьте указать модуль StrUtils.

Ниже приведена реализация функции в модуле StrUtils (если вы используете более старшую версию среди разработки вы
сможете сами добавить этот код и использовать его вместо функции Pos):

Function PosEx(Const SubStr, S: String; Offset: Cardinal = 1): Integer;
var
  I,X: Integer;
  Len, LenSubStr: Integer;
begin
  
If Offset = 1 Then
    Result := Pos(SubStr, S)
  
Else
  
begin
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 
1;
    
While I <= Len Do
    
begin
      
If S[I] = SubStr[1Then
      
begin
        X := 
1;
        
While (X < LenSubStrAnd (S[I + X] = SubStr[X + 1]) Do
          Inc(X);
        
If (X = LenSubStrThen
        
begin
          Result := I;
          Exit;
        
End;
      
End;
      Inc(I);
    
End;
    Result := 
0;
  
End;
End;

 

Сайт рассылки в процессе создания.

Заходите на мой сайт: http://www.petrify.boom.ru (не посвящен ни рассылке, ни дельфи)

Так же можете посетить несколько сайтов для заработка в Интернете:

Hit&Host

 

Raskrutim.ru

 

WmSearch

 


В избранное