У меня так реализовано

procedure Form1_TableGrid1_OnChange (Sender: string);
var
   i,c: integer;
begin
     c := Form1.TableGrid1.RowCount-1; // получаем количество строк в гриде
     for i := 0 to c do // цикл перебора всех строк
     begin
                             // красим ячейку в зависимости от текста в ней, в колонках
          if Form1.TableGrid1.Cells[8,i] = 'Принято' then Form1.TableGrid1.Cell[8,i].Color := clYellow;
          if Form1.TableGrid1.Cells[8,i] = 'Ремонтируется' then Form1.TableGrid1.Cell[8,i].Color := clAqua;
          if Form1.TableGrid1.Cells[8,i] = 'Готов'  then Form1.TableGrid1.Cell[8,i].Color := clLime;
          if Form1.TableGrid1.Cells[8,i] = 'На диагностике' then Form1.TableGrid1.Cell[8,i].Color := clSilver;
          if Form1.TableGrid1.Cells[8,i] = 'Без ремонта' then Form1.TableGrid1.Cell[8,i].Color := clRed;
          if Form1.TableGrid1.Cells[8,i] = 'Согласовать' then Form1.TableGrid1.Cell[8,i].Color := clSkyBlue;
          if Form1.TableGrid1.Cells[8,i] = 'Поиск зип' then Form1.TableGrid1.Cell[8,i].Color := cl3DLight;
          if Form1.TableGrid1.Cells[8,i] = 'Ожидает запчасти' then Form1.TableGrid1.Cell[8,i].Color :=     clFuchsia;
          if Form1.TableGrid1.Cells[9,i] = 'Нет' then Form1.TableGrid1.Cell[9,i].Color :=     clInactiveCaption;
          if Form1.TableGrid1.Cells[9,i] = 'Да' then Form1.TableGrid1.Cell[9,i].Color :=     clLime;
          if Form1.TableGrid1.Cells[10,i] = 'Нет' then Form1.TableGrid1.Cell[10,i].Color :=     clInactiveCaption;
          if Form1.TableGrid1.Cells[10,i] = 'Да' then Form1.TableGrid1.Cell[10,i].Color :=     clLime;
          end;
          end;

Вижу тема буферов .......не тех буферов))))))...точнее буфера, стала весьма востребована))

28

(5 replies, posted in Russian)

Извините соврал) Заработало, забыл точку) Спасибо alex

29

(5 replies, posted in Russian)

alex842 wrote:
  Form1.Edit1.Text:= Form1.Label1.Caption; //Помещаем текст лейбла в текстовое поле.
  Form1.Edit1.SelectAll; //выделяем весь текст
  Form1.Edit1.CopyToClipBoard; //копируем в буфер

Видимо CopyToClipBoard не работает в 1.46 версии (пишет Undeclared идентификатор)

Спасибо, почитал на форуме подобную проблему! Все решилось. Благодарю

31

(5 replies, posted in Russian)

Спасибо! Сегодня попробую, да хочу сделать что то на подобии интерактивной справки по программе

32

(13 replies, posted in Russian)

alex842 wrote:
mitrich45 wrote:

кстати такой вопрос, если будет 2 лейбела, получается нужно и 2 переменные вводить

Пока можно только один "заставить бегать". Думаю, как сделать, чтобы несколько работало.
П.С. Нет. В принципе заставить несколько лейблов "бегать" не проблема, но тогда нужно будет не одной процедурой делать, а расписывать на несколько. А хочется автоматизировать процесс. smile

Ну может Дмитрий со временем сделает новый компонент)

33

(13 replies, posted in Russian)

кстати такой вопрос, если будет 2 лейбела, получается нужно и 2 переменные вводить

34

(13 replies, posted in Russian)

Здорово) Спасибо за труды! Пригодится обязательно)

35

(5 replies, posted in Russian)

Или сделать на форме что то наподобии гиперссылки без использования таблиц

36

(5 replies, posted in Russian)

День добрый, как то можно реализовать выделение надписи лейбела, допустим чтобы скопировать в буфер

login.Close сработал когда сделал модальную основную форму.

Все заработало, как только сделал форму пароля стартовой, другая проблема, при закрытии программы не закрывается стартовая форма, события по клику login.Close и OnClose почему то не работают, работает только спрятать форму login.Hide (остается процесс в системе)

Блин методом тыка обнаружил, что можно менять загрузочную форму по умолчанию ))) Теперь думаю все получится

День добрый! Изначально в проекте не было предусмотрено использование учетных данных и паролей для входа. Но теперь понадобилось, создал форму ввода учетных данных, использовал SQL запрос для разрешения входа:

s := VarToStr( SQLExecute('SELECT count(id) FROM master WHERE (pass = ''' + login.Edit1.Text + ''');') );
     if (s <> '0') and (s<>'') then
     begin
          sUser := login.ComboBox1.Text; 
          login.Close; // закрытие формы

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

procedure login_OnClose (Sender: string; Action: string);
begin
     if sUser='' then Form1.Close;
end;

Как можно защитить ввод пароля от банального закрытия?

41

(3 replies, posted in Russian)

Тоже интересен вопрос!

42

(4 replies, posted in Russian)

А так если реализовать с отсутствующими данными это надо к Дмитрию вам

43

(4 replies, posted in Russian)

Подозреваю, что все дело в NULL, то есть неможет скрипт преобразовать отсутствующее значение. Я делал проще, по дефолту ставил "0" в текстбокс, можно пойти другим путем, добавить всплывающее уведомление, привязанное к кнопке, при нажатии выскакивает сообщение на подобии "не заполнено поле требования".

procedure frmApplication_Button4_OnClick (Sender: string; var Cancel: boolean);
begin
    if frmApplication.Date.Checked = False then
    begin
       ShowMessage('Дата приема - обязательное поле!.'); // ваше сообщение
       Cancel := True; // отменяем действие кнопки
    end;

44

(3 replies, posted in Russian)

у меня сделано в FR3
Скопировать скрипт в код фаст репорта, или скачать во вложении

const
  Max000 = 6; {Кол-во триплетов - 000}
  MaxPosition = Max000 * 3; {Кол-во знаков в числе }
  var

    c100: array[0..9] of string;
    c11: array[0..9] of string;
    c10: array[0..9] of string;
    c1: array[0..1, 0..9] of string;
    c1000w: array[0..Max000] of integer;
    c1000:array[0..Max000] of string;
    w:array[0..1, 0..9] of string;
    ruble: array[0..9] of string;
    Kopeek: array[0..9] of string;


procedure initalize;
begin
       c1000[0]:='';
       c1000[1]:='тысяч';
       c1000[2]:='миллион';
       c1000[3]:='миллиард';
       c1000[4]:='триллион';
       c1000[5]:='квадраллион';
       c1000[6]:='квинтиллион';

       c1000w[0]:=0;
       c1000w[1]:=1;
       c1000w[2]:=0;
       c1000w[3]:=0;
       c1000w[4]:=0;
       c1000w[5]:=0;
       c1000w[6]:=0;

       w[0,0]:='ов ';
       w[0,1]:=' ';
       w[0,2]:='а ';
       w[0,3]:='а ';
       w[0,4]:='а ';
       w[0,5]:='ов ';
       w[0,6]:='ов ';
       w[0,7]:='ов ';
       w[0,8]:='ов ';
       w[0,9]:='ов ';
       w[1,0]:=' ';
       w[1,1]:='а ';
       w[1,2]:='и ';
       w[1,3]:='и ';
       w[1,4]:='и ';
       w[1,5]:=' ';
       w[1,6]:=' ';
       w[1,7]:=' ';
       w[1,8]:=' ';
       w[1,9]:=' ';
     c100[0]:='';
     c100[1]:='сто ';
     c100[2]:='двести ';
     c100[3]:='триста ';
     c100[4]:='четыреста ';
     c100[5]:='пятьсот ';
     c100[6]:='шестьсот ';
     c100[7]:='семьсот ';
     c100[8]:='восемьсот ';
     c100[9]:='девятьсот ';

      c10[0]:='';
      c10[1]:='десять ';
      c10[2]:='двадцать ';
      c10[3]:='тридцать ';
      c10[4]:='сорок ';
      c10[5]:='пятьдесят ';
      c10[6]:='шестьдесят ';
      c10[7]:='семьдесят ';
      c10[8]:='восемьдесят ';
      c10[9]:='девяносто ';

      c11[0]:='';
      c11[1]:='один';
      c11[2]:='две';
      c11[3]:='три';
      c11[4]:='четыр';
      c11[5]:='пят';
      c11[6]:='шест';
      c11[7]:='сем';
      c11[8]:='восем';
      c11[9]:='девят';


      c1[0,0]:='';
      c1[0,1]:='один ';
      c1[0,2]:='два ';
      c1[0,3]:='три ';
      c1[0,4]:='четыре ';
      c1[0,5]:='пять ';
      c1[0,6]:='шесть ';
      c1[0,7]:='семь ';
      c1[0,8]:='восемь ';
      c1[0,9]:='девять ';

      c1[1,0]:='';
      c1[1,1]:='одна ';
      c1[1,2]:='две ';
      c1[1,3]:='три ';
      c1[1,4]:='четыре ';
      c1[1,5]:='пять ';
      c1[1,6]:='шесть ';
      c1[1,7]:='семь ';
      c1[1,8]:='восемь ';
      c1[1,9]:='девять ';

      ruble[0]:='ей';
      ruble[1]:='ь';
      ruble[2]:='я';
      ruble[3]:='я';
      ruble[4]:='я';
      ruble[5]:='ей';
      ruble[6]:='ей';
      ruble[7]:='ей';
      ruble[8]:='ей';
      ruble[9]:='ей';

      Kopeek[0]:='ек';
      Kopeek[1]:='йка';
      Kopeek[2]:='йки';
      Kopeek[3]:='йки';
      Kopeek[4]:='йки';
      Kopeek[5]:='ек';
      Kopeek[6]:='ек';
      Kopeek[7]:='ек';
      Kopeek[8]:='ек';
      Kopeek[9]:='ек';




end;

function Ceil(const X: Extended): Integer;
begin
  Result:=(Trunc(X));
  if Frac(X) > 0 then
    Inc(Result);
end;

Function IIF2( bln:boolean; TruePart:string; FalsePart:string):string;
begin
  if bln then
    Result := TruePart
  else
    Result := FalsePart;

end;

  function Num000toStr(S: string; woman: integer): string;
    {Num000toStr возвращает число для триплета}

  begin {Num000toStr}
    Result:= c100[ord(s[1])-ord('0')] + iif2((s[2] = '1') and (s[3] > '0'), c11[ord(s[3])-ord('0')] +
      'надцать ', c10[ord(s[2])-ord('0')] + c1[woman, ord(s[3])-ord('0')]);
  end; {Num000toStr}

function NumToStr(s: string): string; {Возвращает число прописью}
var
  s000: string;

  isMinus: Boolean;
  isw:integer;
  i: integer; //Сч?тчик триплетов
begin

  Result := '';
  i := 0;
   isMinus := (s <> '') and (s[1] = '-');

  if isMinus then
    s := Copy(s, 2, Length(s) - 1);
  while not ((i >= Ceil(Length(s) / 3)) or (i >= Max000)) do
  begin
    s000 := Copy('00' + s, Length(s) - i * 3, 3);
    isw := c1000w[i];
    if (i > 0) and (s000 <> '000') then //тысячи и т.д.
      Result := c1000[i] + w[Isw, strtoint(iif2(s000[2] = '1', '0', s000[3]))] + Result;
    Result := Num000toStr(s000, isw) + Result;
    Inc(i)
  end;
  if Result = '' then
    Result := 'ноль';
  if isMinus then
    Result := 'минус ' + Result;
end; {NumToStr}

function TrimLeft(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[i] <= ' ') do Inc(I);
  Result := Copy(S, I, 32565555);
end;

function RealToRouble(c: Extended): string;


  function ending(const s: string): Char;
  var
    l: Integer; //С l на 8 байт коротче $50->$48->$3F
  begin //Возвращает индекс окончания

    l := Length(s);
     if(l > 1) and (s[l-1]='1') then
     result:='0'
    else
    result:=s[l];

  end;

var
  rub: string;
  kop: string;
  h,x:integer;
begin {Возвращает число прописью с рублями и копейками}

  Result:=formatfloat('0.00',c);
  h:=length(Result);
  for X:=h to 18 do Result:=' '+Result;
  //Str(c: MaxPosition + 3: 2, Result);

  if Pos('E', Result) = 0 then //Если число можно представить в строке <>1E+99
  begin
    rub := TrimLeft(Copy(Result, 1, Length(Result) - 3));
    kop := Copy(Result, Length(Result) - 1, 2);
    Result := NumToStr(rub) + ' рубл'+ruble[strtoint(ending(rub))]
      + ' ' + kop + ' копе' + Kopeek[strtoint(ending(kop))];
    Result := UpperCase(Result[1]) + Copy(Result, 2, Length(Result) - 1);

  end;
end;
function GetSummaToText(r:real):string;
begin
initalize;
result:=RealToRouble(r);
end;
  
begin
    
                                                            
     memo5.lines.text:=GetSummaToText (<Report."predoplata">) ;
     memo81.lines.text:=GetSummaToText (<Report."predoplata">) ;         
end.

перевести слова на Украинский, пропись формируется в Memo5 и дублируется в Мemo 81 для копии квитанции

DriveSoft wrote:

Приветствую,


Раскрашивать TableGrid в событии OnMouseMove плохая идея, вместо этого, используйте событие компонента OnChange, тогда раскраска будет происходить один раз, сразу после обновления содержимого компонента TableGrid.



Не совсем понял, а зачем постоянно обновлять таблицу на событии OnClick?

Завтра на работе попробую изменить на OnChange

На событии OnClick завязано обновление грида (бывают моменты когда на одном компьютере добавили запись а на другом пока не обновить грид она не появляется, и еще через OnClick показывается детальная информация в других гридах

Доброй ночи Уважаемые!
Все думал думал про оптимизацию, откладывал в долгий ящик, но теперь когда в гриде имеется около 2 тысяч записей появляются тормоза.
Основная причина связана с раскраской по статусу комбобокса при наведнии мышью.
Другая причина в постоянном dbUpdate при клике (так как в базе работаем на 4 компьютерах и поддерживаем актуальные данные)
Может как то можно оптимизировать код, наткнулся на форуме про процедуры BeginUpdate, EndUpdate, но нечего про их применение не нашел. Буду благодарен за любую информацию
С Уважением Дмитрий

procedure Form1_TableGrid1_OnMouseMove (Sender: string; Shift, Alt, Ctrl: boolean; X, Y: Integer);
var
   i,c: integer;
begin
     c := Form1.TableGrid1.RowCount-1; 
     for i := 0 to c do 
     begin
          if Form1.TableGrid1.Cells[8,i] = 'Принято' then Form1.TableGrid1.Cell[8,i].Color := clYellow;
          if Form1.TableGrid1.Cells[8,i] = 'Ремонтируется' then Form1.TableGrid1.Cell[8,i].Color := clAqua;
          if Form1.TableGrid1.Cells[8,i] = 'Готов' then Form1.TableGrid1.Cell[8,i].Color := clLime;
          if Form1.TableGrid1.Cells[8,i] = 'На диагностике' then Form1.TableGrid1.Cell[8,i].Color := clSilver;
          if Form1.TableGrid1.Cells[8,i] = 'Без ремонта' then Form1.TableGrid1.Cell[8,i].Color := clRed;
          if Form1.TableGrid1.Cells[8,i] = 'Согласовать' then Form1.TableGrid1.Cell[8,i].Color := clSkyBlue;
          if Form1.TableGrid1.Cells[8,i] = 'Поиск зип' then Form1.TableGrid1.Cell[8,i].Color := cl3DLight;
          if Form1.TableGrid1.Cells[8,i] = 'Ожидает запчасти' then Form1.TableGrid1.Cell[8,i].Color :=     clFuchsia;
          if Form1.TableGrid1.Cells[9,i] = 'Нет' then Form1.TableGrid1.Cell[9,i].Color :=     clInactiveCaption;
          if Form1.TableGrid1.Cells[9,i] = 'Да' then Form1.TableGrid1.Cell[9,i].Color :=     clLime;
          if Form1.TableGrid1.Cells[10,i] = 'Нет' then Form1.TableGrid1.Cell[10,i].Color :=     clInactiveCaption;
          if Form1.TableGrid1.Cells[10,i] = 'Да' then Form1.TableGrid1.Cell[10,i].Color :=     clLime;
          end;
          end;
procedure Form1_TableGrid1_OnClick (Sender: string);

begin
   Form1.TableGrid1.dbUpdate; //обновление основной таблицы с ремонтами
   Form1.TableGrid2.dbUpdate; // обновление задач для приемки
   Form1.Button5.Click; // прикручен поиск к кнопке для вывода детальной информации о ремонте
   Form1.Button8.Click; // прикручен поиск к кнопке для вывода детальной информации о запчастях
   end;

47

(4 replies, posted in Russian)

Спасибо за помощь, заработало!
про sort by понял...надо было ORDER BY

48

(4 replies, posted in Russian)

Спасибо выслал на почту!

49

(41 replies, posted in Russian)

Программа хороша, что же говорить, каждое обновление ждешь как горячего пирожка. Цена да конечно многим не под силу, как и мне, но каждый хороший продукт стоит хороших денег. Для себя вижу только один выход - стимул для более функциональной своей разработки. Конечно денег за свою базу не беру, периодически выкладываю на свой форум, люди качают, тестируют. Если будут поступать пожертвования на развитие проекта, значит это нужно, то без сомнений приобрету лицензию, дабы усовершенствовать продукт.
Москва тоже не сразу строилась, так что терпения всем и удачи! А критиковать цену считаю ненужно

50

(4 replies, posted in Russian)

http://i9.pixs.ru:/thumbs/7/6/4/RSSRS.jpg_2659311_14919764.jpg
http://i9.pixs.ru:/thumbs/7/6/5/SRRRSS.jpg_8876565_14919765.jpg
Более читабельные скрины