Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.12;
Скачать: CL | DM;

Вниз

Как убрать нули из DBEdit   Найти похожие ветки 

 
Александр_2012   (2012-10-18 10:30) [0]

Доброго дня. Есть программа, содержащая порядка 100 DBEdit, большинство которых привязаны к полям типа Integer, со значением по умолчанию 0 . Всё работает, но раздражает вывод ненужных нулей. Знаю, что можно у TField в событии OnGetText настроить любой формат вывода, но проблема в том, что не хотелось бы загружать жестко все поля БД в OraQuery и на каждое поле писать обработчик OnGetText. Можно ли написать процедуру общую для всех компонентов (работающую, например через Sender), которая обеспечила бы выполнение требуемого, к какому компоненту и событию её привязать?


 
sniknik ©   (2012-10-18 10:53) [1]

> и на каждое поле писать обработчик OnGetText.
напиши один на все.


 
sniknik ©   (2012-10-18 10:59) [2]

+
вообще пустое значение в дб компонентах "забито" под null в данных базы, 0 это уже вполне себе конкретное значение.
лучше не заменять. путаницу только внесешь.


 
Александр_2012   (2012-10-18 11:04) [3]

Увы, базу генерил не я. И логичнее было бы по умолчанию null. Хотелось бы пример, как обратиться к полю и к соответствующему событию не загружая его в соответствующий DataSet.


 
sniknik ©   (2012-10-18 11:23) [4]

> Хотелось бы пример, как обратиться к полю и к соответствующему событию не загружая его в соответствующий DataSet.
???
- не могу доехать до ул. ххх, 13-й автобус не ходит.
- езжай на любом до ххх идут все.
- хотелось бы пример как ездить на автобусе не садясь в него...
???


 
sniknik ©   (2012-10-18 11:25) [5]

> Увы, базу генерил не я. И логичнее было бы по умолчанию null.
может потому и поставили 0 дефаултом что хотели его видеть...


 
Александр_2012   (2012-10-18 11:46) [6]

Есть простейший запрос: select * from tablename where ... OraQuery возвращает набор данных, где надо указать, что нули визуализировать в DBEdit-ах не надо.


 
sniknik ©   (2012-10-18 11:58) [7]

если исходить из запроса то сделай его чуть сложнее, что кстати будет и более правильным, т.к. указывать * моветон (почему... а, загугли).

замени * на имена полей, где нужны замены 0 на нил тоже замени типа (не знаю оракла, т.что приблизительно) iif(field1 = 0, null, field1) as "field1".


 
Александр_2012   (2012-10-18 12:32) [8]

Идея понятна. Проблема в том, что возвращается более 100 полей, если все их перечислять в запросе, да ещё с преобразованием, то запрос получается очень громоздким.


 
sniknik ©   (2012-10-18 12:40) [9]

> Проблема в том, ...
не проблема... не та о которой стоит парится.

но если есть желание то всегда можно вернутся к первому предложенному варианту - sniknik ©   (18.10.12 10:53) [1]


 
Александр_2012   (2012-10-18 12:47) [10]

> и на каждое поле писать обработчик OnGetText.
напиши один на все.

Хотелось бы пример. Как это будет выглядеть.


 
sniknik ©   (2012-10-18 12:52) [11]

> Хотелось бы пример. Как это будет выглядеть.
блин... чувствую себя капитаном очевидность... пример.
procedure TForm1.AllGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
 if Sender.AsString = "0"
   then Text:= ""
   else Sender.AsString;
end;


 
Ega23 ©   (2012-10-18 14:20) [12]

Поправочка:
procedure TForm1.AllGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
 if Sender.AsString = "0"
   then Text:= ""
   else Text:= Sender.AsString;
end;


 
Александр_2012   (2012-10-18 16:39) [13]

Капитану-очевидность
Прошу объяснить как применить этот замечательный код (к чему привязать, откуда на него сослаться)
Юнга-неочевидность


 
Jeer ©   (2012-10-18 17:09) [14]


> Александр_2012   (18.10.12 16:39) [13]

1. Вам или рано или вообще не следует заниматься программированием.
Не, ну бывает так - мозги сложены под "лицезрение", а не аналитику.
2. Вам сказано и сделано все, чтобы Вы поняли и применили.
Если не хватает, значит не хватает.
Еще раз и внимательнее обратите внимание на [1] и [11,12].


 
Ega23 ©   (2012-10-18 17:15) [15]


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



unit Unit50;

interface

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

type

 TForm50 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   procedure FormCreate(Sender: TObject);
 private
   procedure ButtonOnClick(Sender: TObject);
 public
 end;

var
 Form50: TForm50;

implementation

{$R *.dfm}

//*****************************************************************************

{ TForm50 }

procedure TForm50.ButtonOnClick(Sender: TObject);
begin
 ShowMessage(TButton(Sender).Caption);
end;

procedure TForm50.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to ComponentCount - 1 do
   if Components[i] is TButton then
      TButton(Components[i]).OnClick := ButtonOnClick;
end;

end.


Кнопок, как ты понимаешь, можно накидать хоть 100500, для всех OnClick будет одинаков.


 
Inovet ©   (2012-10-18 17:40) [16]

> [15] Ega23 ©   (18.10.12 17:15)
> Кнопок, как ты понимаешь, можно накидать хоть 100500, для
> всех OnClick будет одинаков.

Щас он начнот циклы копипастить. Наверное стрелочку рядом с выбором обработчика события не видит.


 
Jeer ©   (2012-10-18 18:27) [17]


> Ega23 ©   (18.10.12 17:15) [15]


Шо ж ты творишь ?
Сейчас это чудо начнет всовывать твой код в Delphi и искать где ж там Field-ы и почему у них кнопок нет.


 
Ega23 ©   (2012-10-18 20:13) [18]


>
> Шо ж ты творишь ?

А у меня нет TDBEdit. Точнее, есть, но мне было в лом искать :)
Да и ваще, пусть думает. Кто хочет разобраться, тому данного примера будет достаточно. Кто не хочет - я не виноват. :)


 
Jeer ©   (2012-10-19 16:20) [19]


> Кто не хочет - я не виноват. :)


Ну да - "Кито хотел секса и не подстраховался, тот мимо <дамок>" (C)


 
MsGuns ©   (2012-10-22 11:23) [20]

>Александр_2012

Советую Вам почитать хоть одну хорошую (не Архангельского) книжку по ОПП.


 
Александр_2012   (2012-10-22 11:44) [21]

Спасибо, уважаемые господа. Если вы обратили внимание, то я обратился на форум для начинающих. У меня очень большие сомнения, что все начинающие прекрасно разбираются что такое Sender, и как найти те или иные свойства полей БД, если их предварительно не загрузить в редактор полей.


 
Ega23 ©   (2012-10-22 12:02) [22]


> У меня очень большие сомнения, что все начинающие прекрасно
> разбираются что такое Sender

http://slovari.yandex.ru/sender/en-ru/#lingvo/


 
MsGuns ©   (2012-10-22 12:45) [23]

А Вам как начинающему и советуют. Поймите, сложно объяснить новичку  защиту Каро-Кан если он, новичок, не знает как ходят шахматные фигуры.


 
Александр_2012   (2012-10-22 14:15) [24]

Хорошо, попытался воспользоваться Вашими советами.
1. Создал процедуру

procedure TDM.AllGetText(Sender: TField; var Text: String;
 DisplayText: Boolean);
begin
if DisplayText then
 begin
 if Sender.AsString="0" then
   Text:=""
 else
   begin
   Text:=Sender.AsString;
   end;
 end;
end;

Решил, что можно к ней обратиться после открытия набора данных

procedure TDM.DataQAfterOpen(DataSet: TDataSet);
var
i: integer;
begin
for i:=0 to DataQ.FieldCount-1 do
 DataQ.Fields[i].OnGetText:=AllGetText;
end;

Компилирую... Ура нет нулей, но достаточно встать на какое-нибудь поле или на DBNavigator нажать Next, как тут же получаю:

Could not convert variant of type (String) into type (Double)

Если я правильно понял,то ошибку вызывает строка

   Text:=Sender.AsString;

по крайней мере, если её закоментировать, то ошибка исчезает, правда все поля получаю пустыми.

Как это обойти?


 
Медвежонок Пятачок ©   (2012-10-22 14:20) [25]

В приведенной строке нет конвертации к дабл.


 
MsGuns ©   (2012-10-22 14:57) [26]

if not Sender.IsNull then
 <Ваш код>

Ну и Format() вместо AsString
И опять же надо бы проверять тип полей и делать конвертацию только для чисел
И последнее: для "тонкого" отображения полей (даты, дроби..) в нужном формате используется свойство TxxxField.DisplayFormat


 
Медвежонок Пятачок ©   (2012-10-22 15:41) [27]

а все равно не поможет.


 
Inovet ©   (2012-10-22 17:36) [28]

> [24] Александр_2012   (22.10.12 14:15)
> for i:=0 to DataQ.FieldCount-1 do
> DataQ.Fields[i].OnGetText:=AllGetText;

Все поля одного типа?


 
Александр_2012   (2012-10-22 20:17) [29]

Большинство полей integer, есть string  и  datetime


 
sniknik ©   (2012-10-22 21:51) [30]

нужен AllSetText с обратной операцией


 
sniknik ©   (2012-10-22 22:40) [31]

> Большинство полей integer, есть string  и  datetime
а убирать нужно для каких? может нужна процедура AllIntegerGetText ? а не все подряд.


 
Александр_2012   (2012-10-23 15:08) [32]


> а убирать нужно для каких? может нужна процедура AllIntegerGetText
> ? а не все подряд.


Конечно для integer. Пытался делать проверку на тип поля, но не получилось, наверное делал неправильно.


 
Ega23 ©   (2012-10-23 16:56) [33]


> Пытался делать проверку на тип поля, но не получилось, наверное
> делал неправильно.


if Fields[i].FieldType = ftInteger then


 
Eeuwige Rouw   (2012-10-24 04:16) [34]


> Советую Вам почитать хоть одну хорошую (не Архангельского)
> книжку по ОПП.


Что плохого в Архангельском?
Кстати, я один раз пользовал его функцию (к его книге шел диск с примерами),
функция у меня не стабильно работала, выложил ее тут на ваше обсуждение,
и ее назвали говнокодом...

Вот и пойми, кто пишет правильно а кто нет...
Краснов (ОпенГл)... вот это было задушевное чтение...


 
Ega23 ©   (2012-10-24 07:38) [35]


> Что плохого в Архангельском?
> Кстати, я один раз пользовал его функцию (к его книге шел диск с примерами),
> функция у меня не стабильно работала, выложил ее тут на ваше обсуждение,
> и ее назвали говнокодом...

Теперь понимаешь, что плохого в Архангельском?



Страницы: 1 вся ветка

Текущий архив: 2013.05.12;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.008 c
15-1357763402
Юрий
2013-01-10 00:30
2013.05.12
С днем рождения ! 10 января 2013 четверг


2-1351048982
ani
2012-10-24 07:23
2013.05.12
Передача значения из DLL в программу


15-1357504202
Юрий
2013-01-07 00:30
2013.05.12
С днем рождения ! 7 января 2013 понедельник


15-1357590602
Юрий
2013-01-08 00:30
2013.05.12
С днем рождения ! 8 января 2013 вторник


15-1357835257
SaJek
2013-01-10 20:27
2013.05.12
Delphi. По вопросу графики и анимации программах. GUI.