Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Procedure когда работает а когда нет!!! Почему??? 
:(
    Опции темы
ivan219
  Дата 13.6.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Есть код:
Код

Procedure EditCh(TextIn:String; SelStartIn: Integer; var Text:String; SelStart: Integer);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель

Var
  CurStr: String;
  Counter,SelPos,SeparatorPos  :Integer;
  isSeparator: Boolean;
begin
  SelPos:=SelStartIn; //положение курсора
  CurStr:=PChar(TextIn);//Текст из эдита, который изменён
   if length(curStr)<1 then Exit; //Проверка длины

   for counter := 0 to 1 do  //Перечисление по массиву
     if WrongSepArr[counter]<> DecimalSeparator then
       While Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент масива в тексте
         CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор

   SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор

   for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
    Begin
     if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
         curStr[Counter] := DecimalSeparator  //удаляем
     else
       if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
        Begin
         Delete(CurStr,counter,1);  //удаляем
         dec(SelPos); //Уменьшить на 1
        End;
   End;

  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   Begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   End;

   if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then
       Delete(CurStr,length(curStr),1); //Если последний символ E то удаляем его

   if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then
       Delete(CurStr,length(curStr),1); //Если последний символ знак то удаляем его

   if length(curStr)>=2 then //Если длина больше 1
     if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
       Begin
        insert('0',curStr,2); //Вставить 0 вторым символом
        inc(SelPos); //Увеличить на 1
       End;

   if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый сивол запрещён
    Delete(CurStr,1,1); //Удалить

   While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
    delete(CurStr,1,1); //Удалить

   While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
    delete(CurStr,2,1); //Удалить

  Text:=CurStr;
  SelStart:=SelPos;
end;

Эта процедура разрешает ввод-вывод только опредёлённые символы в Edit

Я её использую так:
Код

Procedure TForm1.EditChange(Sender: TObject);
var
Text: String;
SelStart: Integer;
begin
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);
 TLabeledEdit(Sender).Text:=Text;
 TLabeledEdit(Sender).SelStart:=SelStart;
end;

И всё работае.

Но когда я в 
Код
 Procedure TForm1.EditChange(Sender: TObject); 
 вставляю другую процедуру которая работает с Edit то уменя положение указателя мышки или TLabeledEdit(Sender).SelStart:=0;

Код

Procedure TForm1.EditChange(Sender: TObject);
var
Text: String;
SelStart: Integer;
begin
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);
 TLabeledEdit(Sender).Text:=Text;
 TLabeledEdit(Sender).SelStart:=SelStart;
 FN;//процедура работы с Edit
end;


При других вареантах работы т.е. кода я делаю так:
Код

procedure TForm1.FNChange(Sender: TObject);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель
Var
  CurStr,Name: String;
  Counter,SelPos,SeparatorPos:Integer;
begin
 Name:=TLabeledEdit(Sender).Name;
 if (Name='FNC')or(Name='FNLR')or(Name='FNFc')then
  begin
   if TLabeledEdit(Sender).Text='' then
    begin
     TLabeledEdit(Sender).Text:='0';
     TLabeledEdit(Sender).SelStart:=1;
     Exit;
    end;

   SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора
   CurStr:=PChar(TLabeledEdit(Sender).Text);//Текст из эдита, который изменён

   if length(curStr)<1 then Exit; //Проверка длины

   for counter := 0 to 1 do  //Перечисление по массиву
     if WrongSepArr[counter]<> DecimalSeparator then
       While Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент масива в тексте
         CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор

   SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор

   for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
    Begin
     if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
         curStr[Counter] := DecimalSeparator  //удаляем
     else
       if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
        Begin
         Delete(CurStr,counter,1);  //удаляем
         dec(SelPos); //Уменьшить на 1
        End;
   End;

  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   Begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   End;

   if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then
       Delete(CurStr,length(curStr),1); //Если последний символ E то удаляем его

   if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then
       Delete(CurStr,length(curStr),1); //Если последний символ знак то удаляем его

   if length(curStr)>=2 then //Если длина больше 1
     if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
       Begin
        insert('0',curStr,2); //Вставить 0 вторым символом
        inc(SelPos); //Увеличить на 1
       End;

   if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый сивол запрещён
    Delete(CurStr,1,1); //Удалить

   While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
    delete(CurStr,1,1); //Удалить

   While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
    delete(CurStr,2,1); //Удалить

   TLabeledEdit(Sender).Text:=CurStr;
   TLabeledEdit(Sender).SelStart:=SelPos;
  end;

  FN;//процедура работы с Edit
end;

или так:
Код

Procedure TForm1.EditChange(Sender: TObject);
var
Text: String;
SelStart: Integer;
begin
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);
 TLabeledEdit(Sender).Text:=Text;
 TLabeledEdit(Sender).SelStart:=SelStart;
end;

procedure TForm1.KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 FN;//процедура работы с Edit
end;

То тоже всё работает.

А вот именно такая связка нехочет работать:
Код

Procedure TForm1.EditChange(Sender: TObject);
var
Text: String;
SelStart: Integer;
begin
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);
 TLabeledEdit(Sender).Text:=Text;
 TLabeledEdit(Sender).SelStart:=SelStart;
 FN;//процедура работы с Edit
end;


Ещё процедура работы с Edit;
Код

Procedure TForm1.FN;
var
  I:Byte;
begin

 Case K of
      1:FNC.Text:='0';
      2:FNLR.Text:='0';
      3:FNFc.Text:='0';
 end;

 Case FNRG1.ItemIndex of
      0: begin
          A:=1;
          B:=1;
          Case FNRG2.ItemIndex of
               0: FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC1');
               1: FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC4');
          end;
         end;
      1: begin
          A:=2;
          B:=1;
          Case FNRG2.ItemIndex of
               0:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC2');
               1:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC5');
          end;
         end;
      2: begin
          A:=1;
          B:=2;
          Case FNRG2.ItemIndex of
               0:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC3');
               1:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC6');
          end;
         end;
 end;

 Case FNRG2.ItemIndex of
      0: begin
          if FNLR.Tag=1 then
           begin
            FNLR.EditLabel.Caption:='Индуктивность L';
            FNCBLR.Clear;
            for I:=0 to 2 do FNCBLR.Items.Add(ArL[I]);
            FNCBLR.ItemIndex:=0;
            FNCBLR.Hint:='Микрогенри';
            FNLR.Tag:=0;
           end;
           LRCB:=IURCLFTJW('L',FNCBLR.ItemIndex);
         end;
      1: begin
          if FNLR.Tag=0 then
           begin
            FNLR.EditLabel.Caption:='Сопротивление R';
            FNCBLR.Clear;
            for I:=0 to 3 do FNCBLR.Items.Add(ArR[I]);
            FNCBLR.ItemIndex:=0;
            FNCBLR.Hint:='Ом';
            FNLR.Tag:=1;
           end;
           LRCB:=IURCLFTJW('R',FNCBLR.ItemIndex);
         end;
 end;

 CCB:=IURCLFTJW('C',FNCBC.ItemIndex);
 FcCB:=IURCLFTJW('F',FNCBFc.ItemIndex);
 
 C:=StrToFloat(FNC.Text)*B*CCB;
 LR:=StrToFloat(FNLR.Text)*A*LRCB;
 Fc:=StrToFloat(FNFc.Text)*FcCB;

 if C=0 then
  if (LR<=0)or(Fc<=0)then Exit
  else
   begin
    K:=1;
    Case FNRG2.ItemIndex of
         0: C:=1/(Sqr(Pi*Fc)*LR);
         1: C:=1/(2*Pi*Fc*LR);
    end;
    FNC.Color:=clYellow;
    FNC.Text:=FloatToStr(C/(B*CCB));
   end;

 if LR=0 then
  if (C<=0)or(Fc<=0)then Exit
  else
   begin
    K:=2;
    Case FNRG2.ItemIndex of
         0: LR:=1/(Sqr(Pi*Fc)*C);
         1: LR:=1/(2*Pi*Fc*C);
    end;
    FNLR.Color:=clYellow;
    FNLR.Text:=FloatToStr(LR/(A*LRCB));
   end;

 if Fc=0 then
  if (C<=0)or(LR<=0)then Exit
  else
   begin
    K:=3;
    Case FNRG2.ItemIndex of
         0: Fc:=1/(Pi*Sqrt(LR*C));
         1: Fc:=1/(2*Pi*Lr*C);
    end;
    FNFc.Color:=clYellow;
    FNFc.Text:=FloatToStr(Fc/FcCB);
   end;
end;


Почему smile

Добавлено @ 18:09 
Весь рабочий код:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, XPMan, ProFun;

type
  TForm1 = class(TForm)
    FNImage1: TImage;
    FNImage2: TImage;
    FNButton: TButton;
    FNCBC: TComboBox;
    FNCBLR: TComboBox;
    FNCBFc: TComboBox;
    FNC: TLabeledEdit;
    FNLR: TLabeledEdit;
    FNFc: TLabeledEdit;
    FNGB1: TGroupBox;
    FNRG2: TRadioGroup;
    FNRG1: TRadioGroup;
    procedure FNCBKeyPress(Sender: TObject; var Key: Char);
    procedure FNButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FNChange(Sender: TObject);
    procedure FN;
    procedure FNCBSelect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
    ArL : array[0..2] of String =('мкГн','мГн','Гн');
    ArR : array[0..3] of String =('Ом','кОм','мОм','гОм');
var
  C,LR,Fc,CCB,LRCB,FcCB:Real;
  K,A,B:Byte;
  Form1: TForm1;

implementation

{$R *.dfm}
{$R Pics.res}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Top:=0;
 Left:=(Screen.Width-Width) div 2;
 FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC1');
end;

procedure TForm1.FNCBKeyPress(Sender: TObject; var Key: Char);
begin
 Key:=#13;
end;

procedure TForm1.FNChange(Sender: TObject);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель
Var
  CurStr,Name: String;
  Counter,SelPos,SeparatorPos:Integer;
begin
 Name:=TLabeledEdit(Sender).Name;
 if (Name='FNC')or(Name='FNLR')or(Name='FNFc')then
  begin
   if TLabeledEdit(Sender).Text='' then
    begin
     TLabeledEdit(Sender).Text:='0';
     TLabeledEdit(Sender).SelStart:=1;
     Exit;
    end;

   SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора
   CurStr:=PChar(TLabeledEdit(Sender).Text);//Текст из эдита, который изменён

   if length(curStr)<1 then Exit; //Проверка длины

   for counter := 0 to 1 do  //Перечисление по массиву
     if WrongSepArr[counter]<> DecimalSeparator then
       While Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент масива в тексте
         CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор

   SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор

   for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
    Begin
     if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
         curStr[Counter] := DecimalSeparator  //удаляем
     else
       if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
        Begin
         Delete(CurStr,counter,1);  //удаляем
         dec(SelPos); //Уменьшить на 1
        End;
   End;

  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   Begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   End;

   if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then
       Delete(CurStr,length(curStr),1); //Если последний символ E то удаляем его

   if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then
       Delete(CurStr,length(curStr),1); //Если последний символ знак то удаляем его

   if length(curStr)>=2 then //Если длина больше 1
     if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
       Begin
        insert('0',curStr,2); //Вставить 0 вторым символом
        inc(SelPos); //Увеличить на 1
       End;

   if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый сивол запрещён
    Delete(CurStr,1,1); //Удалить

   While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
    delete(CurStr,1,1); //Удалить

   While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
    delete(CurStr,2,1); //Удалить

   TLabeledEdit(Sender).Text:=CurStr;
   TLabeledEdit(Sender).SelStart:=SelPos;
  end;
  FN;
end;

procedure TForm1.FNCBSelect(Sender: TObject);
var
  Name:String;
begin
 Name:=TComboBox(Sender).Name;
 if Name='FNCBC'then FNCBC.Hint:=HintIURCLFTJW('C',FNCBC.ItemIndex);
 if Name='FNCBLR'then
  Case FNRG2.ItemIndex of
       0:FNCBLR.Hint:=HintIURCLFTJW('L',FNCBLR.ItemIndex);
       1:FNCBLR.Hint:=HintIURCLFTJW('R',FNCBLR.ItemIndex);
  end;
 if Name='FNCBFc'then FNCBFc.Hint:=HintIURCLFTJW('F',FNCBFc.ItemIndex);
 FN;
end;

Procedure TForm1.FN;
var
  I:Byte;
begin

 Case K of
      1:FNC.Text:='0';
      2:FNLR.Text:='0';
      3:FNFc.Text:='0';
 end;

 Case FNRG1.ItemIndex of
      0: begin
          A:=1;
          B:=1;
          Case FNRG2.ItemIndex of
               0: FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC1');
               1: FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC4');
          end;
         end;
      1: begin
          A:=2;
          B:=1;
          Case FNRG2.ItemIndex of
               0:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC2');
               1:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC5');
          end;
         end;
      2: begin
          A:=1;
          B:=2;
          Case FNRG2.ItemIndex of
               0:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC3');
               1:FNImage2.Picture.Bitmap.LoadFromResourceName(hInstance, 'PIC6');
          end;
         end;
 end;

 Case FNRG2.ItemIndex of
      0: begin
          if FNLR.Tag=1 then
           begin
            FNLR.EditLabel.Caption:='Индуктивность L';
            FNCBLR.Clear;
            for I:=0 to 2 do FNCBLR.Items.Add(ArL[I]);
            FNCBLR.ItemIndex:=0;
            FNCBLR.Hint:='Микрогенри';
            FNLR.Tag:=0;
           end;
           LRCB:=IURCLFTJW('L',FNCBLR.ItemIndex);
         end;
      1: begin
          if FNLR.Tag=0 then
           begin
            FNLR.EditLabel.Caption:='Сопротивление R';
            FNCBLR.Clear;
            for I:=0 to 3 do FNCBLR.Items.Add(ArR[I]);
            FNCBLR.ItemIndex:=0;
            FNCBLR.Hint:='Ом';
            FNLR.Tag:=1;
           end;
           LRCB:=IURCLFTJW('R',FNCBLR.ItemIndex);
         end;
 end;

 CCB:=IURCLFTJW('C',FNCBC.ItemIndex);
 FcCB:=IURCLFTJW('F',FNCBFc.ItemIndex);
 
 C:=StrToFloat(FNC.Text)*B*CCB;
 LR:=StrToFloat(FNLR.Text)*A*LRCB;
 Fc:=StrToFloat(FNFc.Text)*FcCB;

 if C=0 then
  if (LR<=0)or(Fc<=0)then Exit
  else
   begin
    K:=1;
    Case FNRG2.ItemIndex of
         0: C:=1/(Sqr(Pi*Fc)*LR);
         1: C:=1/(2*Pi*Fc*LR);
    end;
    FNC.Color:=clYellow;
    FNC.Text:=FloatToStr(C/(B*CCB));
   end;

 if LR=0 then
  if (C<=0)or(Fc<=0)then Exit
  else
   begin
    K:=2;
    Case FNRG2.ItemIndex of
         0: LR:=1/(Sqr(Pi*Fc)*C);
         1: LR:=1/(2*Pi*Fc*C);
    end;
    FNLR.Color:=clYellow;
    FNLR.Text:=FloatToStr(LR/(A*LRCB));
   end;

 if Fc=0 then
  if (C<=0)or(LR<=0)then Exit
  else
   begin
    K:=3;
    Case FNRG2.ItemIndex of
         0: Fc:=1/(Pi*Sqrt(LR*C));
         1: Fc:=1/(2*Pi*Lr*C);
    end;
    FNFc.Color:=clYellow;
    FNFc.Text:=FloatToStr(Fc/FcCB);
   end;
end;

procedure TForm1.FNButtonClick(Sender: TObject);
begin
 FNC.Text:='0';
 FNLR.Text:='0';
 FNFc.Text:='0';
 FNC.Color:=clWindow;
 FNLR.Color:=clWindow;
 FNFc.Color:=clWindow;
 FNCBC.ItemIndex:=0;
 FNCBLR.ItemIndex:=0;
 FNCBFc.ItemIndex:=2;
 FNRG1.ItemIndex:=0;
 FNRG2.ItemIndex:=0;
 FNCBC.Hint:='ПикоФарад';
 FNCBLR.Hint:='Микрогенри';
 FNCBFc.Hint:='Мегагерц';
 K:=0;
end;
end.


И соответственно нерабочий:
Код

procedure TForm1.FNChange(Sender: TObject);

Var
   Text: String;    
   SelStart: Integer;
begin
 Name:=TLabeledEdit(Sender).Name;
 if (Name='FNC')or(Name='FNLR')or(Name='FNFc')then
  begin
   if TLabeledEdit(Sender).Text='' then
    begin
     TLabeledEdit(Sender).Text:='0';
     TLabeledEdit(Sender).SelStart:=1;
     Exit;
    end;
    
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);    
 TLabeledEdit(Sender).Text:=Text;    
 TLabeledEdit(Sender).SelStart:=SelStart;

 FN;
end;



Всё дело в ней:
Код

 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);    
 TLabeledEdit(Sender).Text:=Text;    
 TLabeledEdit(Sender).SelStart:=SelStart;

Может я её нетак написал smile но в других случаях она работает smile  

А тут можно взять исходники http://calculator2006.narod.ru/NC.rar   

Это сообщение отредактировал(а) ivan219 - 13.6.2006, 18:16
PM MAIL ICQ   Вверх
Mal Hack
Дата 13.6.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Цитата(ivan219 @  13.6.2006,  19:00 Найти цитируемый пост)
Эта процедура разрешает ввод-вывод только опредёлённые символы в Edit

Почему бы не сделать так:
Код
procedure TForm1.LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
begin
  if NOT ( Key in ['0'..'9','-'] ) then
    Key := #0;
end;
 
PM ICQ   Вверх
ivan219
Дата 13.6.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



 smile Этот вареант меня неустраивает, ты процедуру посмотри и что она делает и то она немного недоработана при таком вареанте нет возможности вводить экспоненциальные числа 1.3Е2 (можно но есть некоторые тонкости работы моей программы) а выводить можно но это я дальше сам решу 
Код

(эта прцедура делает ввод-вывод чисел типа Real т.е. '0..9',',','.','+','-','Е')

Проблема вдругом я об этом выше написал. 
PM MAIL ICQ   Вверх
Mal Hack
Дата 13.6.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Ты хочешь форматный ввод чисел в формате целовго числа, дробного и экспоненциального реализовать? 
PM ICQ   Вверх
ivan219
Дата 13.6.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Это уже реализовано (частично) там можно вводить-выводить любое число кроме экспоненциального его только выводить можно.

Я задал другой вопрос. 
PM MAIL ICQ   Вверх
Mal Hack
Дата 13.6.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Я бы делал проще. Может из-за сложности что-то пропустил...
Скачал исходник, вроде все работает.
Покажи конкретно, где что не так. 
PM ICQ   Вверх
Albinos_x
Дата 13.6.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



может так попробовать:
Код
...
... (Sender as TLabeledEdit).SelStart ...
...
 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Mechanic
Дата 14.6.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Ну, нагородил..  smile 
 А не проще брать введенное, и пробовать его в число преобразовать тем же Val, и если не получилось, то возвращать в edit с писком и выделением цветом? Бо кумарит юзверя, когда "умные" edit'ы начинают возмущаться, пока ещё текст не добит до конца.. ;) 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
ivan219
  Дата 14.6.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Mal Hack @ 13.6.2006,  21:56)
Я бы делал проще. Может из-за сложности что-то пропустил...
Скачал исходник, вроде все работает.
Покажи конкретно, где что не так.

Прочитай первый пост:

Проблема в этом когда я делаю так как написано то вылазиет бяка вот такого плана TLabeledEdit(Sender).SelStart:=0; причём всегда стоит 0.
Код

Procedure TForm1.EditChange(Sender: TObject);    
var    
Text: String;    
SelStart: Integer;    
begin    
 EditCh(TLabeledEdit(Sender).Text,TLabeledEdit(Sender).SelStart,Text,SelStart);    
 TLabeledEdit(Sender).Text:=Text;    
 TLabeledEdit(Sender).SelStart:=SelStart;    
 FN;//процедура работы с Edit    
end;


Добавлено @ 10:27 
Цитата(Mechanic @ 14.6.2006,  08:42)
Ну, нагородил..  smile 
 А не проще брать введенное, и пробовать его в число преобразовать тем же Val, и если не получилось, то возвращать в edit с писком и выделением цветом? Бо кумарит юзверя, когда "умные" edit'ы начинают возмущаться, пока ещё текст не добит до конца.. ;)

Да сразу видно ты нестремишся к идеальному smile 

Просто оно конешно прото но чтоб научится кодить надо создавать трудности и искать на них ответ а простое пикание это невыход пользователь вед глуп (извиняюсь) ему надо что всё работало как часы (не китайские  smile )

Добавлено @ 10:29 
Цитата(Albinos_x @ 13.6.2006,  22:01)
может так попробовать:
Код
...
... (Sender as TLabeledEdit).SelStart ...
...

Во первое дельное предложение спасибо smile щас попробую и отпишусь.  

Это сообщение отредактировал(а) ivan219 - 14.6.2006, 10:32
PM MAIL ICQ   Вверх
ivan219
Дата 14.6.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Сделал получилось тоже самое smile
Пробовал по разному. 
Код

  EditCh((Sender as TLabeledEdit).Text,(Sender as TLabeledEdit).SelStart,Text,SelStart);
  (Sender as TLabeledEdit).Text:=Text;
  (Sender as TLabeledEdit).SelStart:=SelStart;

И так тоже.
Код

  EditCh(TLabeledEdit.Text, TLabeledEdit.SelStart,Text,SelStart);
  (Sender as TLabeledEdit).Text:=Text;
  (Sender as TLabeledEdit).SelStart:=SelStart;

Вобщем как был курсор мышки в ночале Edit так он там и остался и цифры идут не так как надо (1234567890) а так (0987654321) получается что: 
Код

 (Sender as TLabeledEdit).SelStart:=0;
 
PM MAIL ICQ   Вверх
Romikgy
Дата 14.6.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Имхо , (правда весь код не разбирал), у тя там такая злейшая рекурсия крутится, брррр
ты из ченча, меняешь значение эдита, и снова попадаешь в ченч, и по новой,
и вообще оптимизация должна быть оправданой, имхо у тебя нет этого( оправдания всмысле) 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ivan219
  Дата 14.6.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Romikgy @ 14.6.2006,  12:17)
Имхо , (правда весь код не разбирал), у тя там такая злейшая рекурсия крутится, брррр
ты из ченча, меняешь значение эдита, и снова попадаешь в ченч, и по новой,
и вообще оптимизация должна быть оправданой, имхо у тебя нет этого( оправдания всмысле)

А поподробнее smile  
PM MAIL ICQ   Вверх
Romikgy
Дата 15.6.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(ivan219 @ 14.6.2006,  15:38)
Цитата(Romikgy @ 14.6.2006,  12:17)
Имхо , (правда весь код не разбирал), у тя там такая злейшая рекурсия крутится, брррр
ты из ченча, меняешь значение эдита, и снова попадаешь в ченч, и по новой,
и вообще оптимизация должна быть оправданой, имхо у тебя нет этого( оправдания всмысле)

А поподробнее smile

Что именно те поподробнее?
Сделай для каждого эдита свой обработчик, 
да и подумай что бы не было зацикливания, т.к. если что то цепляешь на изменение эдита, то оно будет вызыватся не только когда юзер батоны на клаве давит , но всегда когда изменяется эдит!
Имхо лучше все что ты делаешь перенести в keypress допустим,
и у меня лично , ни одна картинка из ресурса не загрузилась smile, я бы их все накидалбы в ImageList, имхо с ним проще работать 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ivan219
Дата 15.6.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Ммммм даааа во наворочил smile 

Простой способ узнать сколько раз вызывается процедура.
Код

Procedure TForm1.FN;
var
  I:Byte;
begin
 Inc(V);
 Case K of
      1:FNC.Text:='0';
      2:FNLR.Text:='0';
      3:FNFc.Text:='0';
 end;
.
.
.
.
.
.
end.


Потом вывести это значение.
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption:=FloatToStr(V);
 V:=0;
end;


Уменя получалось от 2 до 83 раз smile 

Romikgy спасибо за предупреждение буду рботать над этим. 
PM MAIL ICQ   Вверх
ivan219
  Дата 15.6.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Ура всё работает как надо и как таковой вопрос этого топика исчерпан (неполностью) всёже интересно почему эти две процедуры неподружились.

Рекурсия практически исчезла тепери от 1 до 9 прохождений по процедуре FN; при условии нажатия на 1 - все контролы (по одному разу).

Может можно ещё что улучшить smile 

Жду предложений.  

Это сообщение отредактировал(а) ivan219 - 15.6.2006, 19:14
PM MAIL ICQ   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.