Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];

Вниз

Как убрать нули из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.002 c
15-1357849802
Юрий
2013-01-11 00:30
2013.05.12
С днем рождения ! 11 января 2013 пятница


15-1356279639
azlk52
2012-12-23 20:20
2013.05.12
слетают настройки биоса


15-1357904865
NailMan
2013-01-11 15:47
2013.05.12
Сброс настроек панели задач в win7


2-1350541837
Александр_2012
2012-10-18 10:30
2013.05.12
Как убрать нули из DBEdit


15-1357761418
Jeer
2013-01-09 23:56
2013.05.12
Пятилетний отчет.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский