Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2012, 06:41   #21
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Если в этом обработчике, то так

Код:
ShowMessage((Sender as TForm).Name);
Баламут вне форума Ответить с цитированием
Старый 06.06.2012, 07:21   #22
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,885
По умолчанию

Если имя нужно только для изменения цвета, то смысла нет трогать имя, сразу использовать цвет
Код:
(Sender as TForm).Color := clred;
Вообще, логика не очень понятна, зачем раскрашивать форму, чтобы показать что мы именно её закрываем, ведь юзер и так щёлкнул на крестик именно той формы которую он хочет закрыть (разве что, логичен вариант с программным закрытием, не по крестику)
phomm вне форума Ответить с цитированием
Старый 06.06.2012, 18:44   #23
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

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

-------------------------------
Вот, кинул на форму pm5: TPopupMenu на стадии разработки и написал там такой код в пункте:
Код:
procedure TForm1.N22Click(Sender: TObject);
var
 DinLabel: TsLabel;
 ColorDialog: TsColorDialog;
begin
 DinLabel:=TsLabel.Create(Self);
 DinLabel.Font.Size:=8;
 DinLabel.Align:=alBottom;
 DinLabel.Caption:=(Sender as TsRichEdit).Name;

 ColorDialog:=TsColorDialog.Create(Self);

 (Sender as TsRichEdit).Color:=ColorDialog.Color;

 Form1.pFIBQuery2.Close;
 Form1.pFIBQuery2.SQL.Text:='UPDATE T_' + l + ' SET COLOR=:C WHERE ID=:I';
 Form1.pFIBQuery2.ParamByName('I').Value:=1;
 Form1.pFIBQuery2.ParamByName('C').Value:=(Sender as TsRichEdit).Color;
 Form1.pFIBQuery2.ExecQuery;
 Form1.pFIBQuery2.Transaction.Commit;
end;
Сначала мне нужно занести в строковую переменную имя RichEdit (это работает правильно). Потом мне надо присвоить из диалога цвет компоненту RichEdit, а потом обновить в базе данных значение цвета этого компонента.
До выбора цвета сам RichEdit создается динамически так:
Код:
var
 RichEdit: TsRichEdit;
begin
//создаю компонент TsRichEdit
   RichEdit:=TsRichEdit.Create(Form);
   RichEdit.Parent:=Form;
   RichEdit.Align:=alClient;
   RichEdit.BevelOuter:=bvNone;
   RichEdit.Lines.Add(bodynote);
   RichEdit.Font.Name:='Monotype Corsiva';
   RichEdit.Font.Size:=12;
   RichEdit.SkinData.CustomColor:=True;
   RichEdit.SkinData.CustomFont:=True;
   RichEdit.Color:=StringToColor(col);
   RichEdit.PopupMenu:=pm5;
   RichEdit.Name:='sRichEdit' + IntToStr(fFormName);
//   RichEdit.OnContextPopup:=sRichEdit1ContextPopup;
end;
Но, при выборе цвета из попапменю, на пункте выбора цвета, выдается ошибка: "Invalid class typecast". Что я неправильно привожу?
С именем компонента разобрался. Прошу помочь с правкой кода выше.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 07.06.2012, 11:00   #24
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,885
По умолчанию

В обработчике щелчка по пункту меню Вы используете каст
(Sender as TsRichEdit) хотя сендер - суть менюитем.

Цитата:
Сначала мне нужно занести в строковую переменную имя RichEdit (это работает правильно)
работает правильно, думаю, потому что свойство name наследуется аж из tcontrol (емнип) и работает через тконтрол

Вам надо, по идее, обратиться к ричедиту как к владельцу попапменю, у меню есть свойство PopupComponent- кто меню вызвал, через него и надо работать, приводя к типу рич эдита.

Последний раз редактировалось phomm; 07.06.2012 в 11:03.
phomm вне форума Ответить с цитированием
Старый 08.06.2012, 16:33   #25
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Прошу помощи в оформлении строчки условия. Вот код:
Код:
begin
//получаю список значений в поле, для которого будет делаться условие в Where
    Form1.pFIBQuery2.Close;
    Form1.pFIBQuery2.SQL.Clear;
    Form1.pFIBQuery2.SQL.Text:='select * from T_KATEGORII';
    Form1.pFIBQuery2.ExecQuery;
    SL:=TStringList.Create;
    while not Form1.pFIBQuery2.Eof do
    begin
      SL.Add(Form1.pFIBQuery2.FieldByName('KATEGORIYNAME').AsString);
      Form1.pFIBQuery2.Next;
    end;
    SL.Delimiter:=',';

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

    for k := 0 to SL.Count - 1 do
    begin

     Form1.pFIBQuery2.Close;
     Form1.pFIBQuery2.SQL.Clear;
     Form1.pFIBQuery2.SQL.Text:='select * from T_' + User + ' where KATEGORIY in (' + SL.Strings[k] + ')';
     Form1.pFIBQuery2.ExecQuery;
     while not Form1.pFIBQuery2.Eof do
     begin

      Form:=TForm.Create(Self);
      Form.BorderIcons:=[biSystemMenu];
      Form.Height:=220;
      Form.Width:=225;
      Form.Position:=poDesigned;
      Inc(xLeft,225);
      if xLeft + Form.Width > Screen.Width then
      begin
       xLeft:=0;
       Inc(xTop,220);
      end;
      Form.Top:=xTop;
      Form.Left:=xLeft;
      Form.Name:='Form' + IntToStr(Form1.pFIBQuery2.FieldByName('ID').AsInteger);
      Form.Caption:=SL.Strings[k];
      Form.BorderStyle:=bsSizeable;
      Form.Color:=StringToColor(col);
      Form.Show;
      Form1.pFIBQuery2.Next;
     end;
    SL.Free;
    end;
   SL.Free;
end;
Но выдается ошибка:
Указанная буква П - это первая буква из списка SL, который сформировался в начале кода.
Изображения
Тип файла: png Ошибка.png (5.3 Кб, 58 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.06.2012, 16:40   #26
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

кавычек не хватает

Код:
'select * from T_' + User + ' where KATEGORIY in ("' + SL.Strings[k] + '")';
(двойные или одинарные не помню, но какие-то точно нужны).

А ещё лучше через вычисляемое поле, иначе ожидайте SQL-injection в ближайшем будщем )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.06.2012, 16:48   #27
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Не, с добавлением кавычек не прокатило. Выдалась та же ошибка, но только уже вместо первой буквы П, было написано полностью первое из списка значение. Есть мысли на этот счет?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.06.2012, 17:29   #28
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Мысль есть - ошибка синтаксиса. Делай точку останова и смотри какой запрос посылаешь. Должен выглядеть примерно так
Код:
select * from T_00 where KATEGORIY in ('GG','HH','DD1')
T_00 и значения констант в IN списке там твои само-собой. Это если категория символьного типа.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.06.2012, 17:45   #29
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Поле KATEGORIY имеет тип VARCHAR. У меня такие и передаются данные, в таком виде. Я проверял, ставил ShowMessage() перед передачей и смотрел как данные будут выглядеть в запросе. Один фиг это не помогает. Поможет, только если я явно перечислю значения из поля, но я не знаю, сколько их может быть и какими они будут.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.06.2012, 17:50   #30
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Судя по коду там просто достаточно select * from T_00 where KATEGORIY='GG'. Места для IN не вижу. И один SL.Free; явно лишний (первый)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.06.2012 в 17:53.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка сразу нескольких StringGrid Artamos Компоненты Delphi 7 13.05.2011 13:58
Установка нескольких атрибутов сразу Shouldercannon Общие вопросы Delphi 7 01.05.2011 22:49
обращение к именам компонентов в цикле JK0 Помощь студентам 7 23.09.2010 14:10
заполнение сразу нескольких однотипных значений Domanoff БД в Delphi 2 22.04.2010 13:37
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35