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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 09:45   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Восклицание Цикл For c TsCheckBox пропускает значения 0 2 3 ...

Код:
var
  Checks: TsCheckBox  // Skin
  IndexN: integer     // индекс каждого чек бокса, у меня их 16
  List[3]: TObjectList;  
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ...
  NewCreate(IndexN);  // выполняеца 16 раз
  ...
end;

procedure TForm1.NewCreate(S: Integer); 
begin
  Checks := TsCheckBox.Create(self);
  List[3].Add(Checks);
  with Checks do
  begin
    Parent := Panels;
    Left := 246;
    Top := 3;
    Width := 20;
    Height := 20;
    Name := 'Checks' + IntToStr(S);
    Caption := '';
    SkinData.SkinSection := 'CHECKBOX';
    ImgChecked := 0;
    OnClick := ChecksClick;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  for i := 0 to IndexN - 1 do
    TsCheckBox(list[3][i]).Checked:=true;
end;
i приравниваеца к таким значениям
0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
как такое бывает и как ето можно исправит, подскажите пожалуста?
проблема в етои строке, но мне она нужна)
TsCheckBox(list[3][i]).Checked:=true;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 30.01.2011, 11:07   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
NewCreate(IndexN); // выполняеца 16 раз
Где это видно ? Видно, что выполняется 1 раз...
Или вы 16 раз выполняете FormCreate() ??? Где ?

З.Ы. Вам не стыдно писать "выполняеца" вместо "выполняется" ? Вы хотите поскорее прослыть безграмотным ?
asmodey1 вне форума Ответить с цитированием
Старый 30.01.2011, 11:47   #3
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
З.Ы. Вам не стыдно писать "выполняеца" вместо "выполняется" ? Вы хотите поскорее прослыть безграмотным ?
транслитом писал, до того как на форуме прописался, не судите строго, переучусь
Код:
IndexN читаю с ини фаила, для примера можно взять равное 5

  for i:= 1 to IndexN do                                                
    NewCreate(i);
ест еше дополнение
Код:
procedure TForm1.ChecksClick(Sender: TObject);
begin
  if TsCheckBox(Sender).Checked then
    CheckInc.Add(IntToStr(List[3].IndexOf(Sender)))
    else
      for i := 0 to CheckInc.Count - 1 do
        if CheckInc[i] = IntToStr(List[3].IndexOf(Sender)) then
        begin
          CheckInc.Delete(i);
          Break;
        end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 30.01.2011, 11:59   #4
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
как такое бывает и как ето можно исправит
никак не исправляется, потому что такого не бывает ) Если не верите - поставьте BreakPoint на интересующую Вас строку и выполните пошаговое выполнение.

Код:
NewCreate(IndexN);  // выполняеца 16 раз
Если он выполняется 16 раз, то индексы д/б 0..15. И как, в таком случае, вы вот это выяснили:
Цитата:
i приравниваеца к таким значениям
0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 30.01.2011, 12:19   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Восклицание

1)
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Clear;
  for i := 1 to indexn do
  begin
    Edit1.Text := Edit1.Text + inttostr(i - 1) + ' ';
    TsCheckBox(list[3][i - 1]).Checked:=true;
  end;
end;
резултат - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

2)
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Clear;
  for i := 0 to indexn - 1 do
  begin
    Edit1.Text := Edit1.Text + inttostr(i) + ' ';
    TsCheckBox(list[3][i]).Checked:=true;
  end;
end;
резултат - 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

обшии код один и тот же, вариант 1 работает, вариант 2 нет, вот я и думаю, даже если я где то в другом месте допустил ошибку, как в принципе один и тот же код дает разныи резултат?
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 30.01.2011, 12:33   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию вот вес проект

http://programmersforum.ru/attachmen...1&d=1296380917
Вложения
Тип файла: rar ADShow 1.0.rar (5.54 Мб, 13 просмотров)
VirusN13

Последний раз редактировалось ArtGrek; 30.01.2011 в 12:49.
ArtGrek вне форума Ответить с цитированием
Старый 30.01.2011, 12:37   #7
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

вставляй хоть первый хоть второй вариант работает . нужен весь проект а так....
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
  procedure NewCreate(S: Integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  Checks: TsCheckBox;  // Skin
  IndexN: integer;     // индекс каждого чек бокса, у меня их 16
  List: array[1..9] of TObjectList;
  i:integer;

implementation

{$R *.dfm}

procedure TForm1.NewCreate(S: Integer);
begin
  Checks := TsCheckBox.Create(self);
  List[3].Add(Checks);
  with Checks do
  begin
    Parent := Form1;
    Left := 246;
    Top := 3;
    Width := 20;
    Height := 20;
    Name := 'Checks' + IntToStr(S);
    Caption := '';
    SkinData.SkinSection := 'CHECKBOX';
    ImgChecked := 0;
  //  OnClick := ChecksClick;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Clear;
  for i := 1 to indexn do
  begin
    Edit1.Text := Edit1.Text + inttostr(i - 1) + ' ';
    TsCheckBox(list[3][i - 1]).Checked:=true;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
List[3]:=TObjectList.Create;
IndexN:=16;
for i:= 1 to IndexN do
NewCreate(i);

end;

end.
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 30.01.2011, 12:43   #8
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Ссылка не работает. Прикрепите еще раз.
Кстати, пользоваться глобальной переменной i для организации цикла - это очень скверная привычка. Всегда нужно объявлять ее локально:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var I : Integer;
begin
  Edit1.Clear;
Объявите везде, где это возможно переменные локальными - и посмотрите еще раз.
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FindFirstFile не пропускает папки Nitrino Win Api 2 20.06.2010 20:03
Почему первый байт пропускает? FantomasRUS Общие вопросы Delphi 2 12.05.2010 21:36
Функция, которая пропускает выходные. jungo Microsoft Office Excel 12 25.06.2008 08:59
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34