Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Spalten überprüfen... (https://www.delphipraxis.net/180204-spalten-ueberpruefen.html)

Simo 2. Mai 2014 13:21

AW: Spalten überprüfen...
 
Ich habe wie gesagt 3 Units :
1 Unit : Da werden die Funktionen programmiert.
2.Unit(VCL-Formular) : Code+Design, da wird definiert welche Überprüfung(Funktion) für welche Spalte durchzuführen ist ( in den ComboBoxen).
3.Unit (VCL-Formularanwendung). Da wurde schon alles (richtig) programmiert. und genau beim Prozedur SpeichernClick muss die Abfragen gemacht werden damit es eine Fehlermeldung gibt..!!

Ich weiss nicht wie ich 3 Code miteinander verbinde.. Wo soll ich was aufrufen.. -(?

Ich brauche Ihre Hilfe.. Ich komme nicht weiter!

p80286 2. Mai 2014 14:00

AW: Spalten überprüfen...
 
Nur mal ganz schnell im vorbeischauen
warum hast Du Unit2 und Unit3 da wird doch das gleiche gemacht???
Wnn Du in Unit2 die Funktionen aus Unit1 brachst dann
Delphi-Quellcode:
Uses
  UNIT1, {Funktionen für ...}
  noch mehr units.......
  ;
Analog natürlich auch für andere Units. Nur bekommst Du ein Problem wenn Du
Delphi-Quellcode:
Unit1
uses unit2;
Delphi-Quellcode:
Unit2
uses unit1;
verwenden willst.
Funktionen, die in mehreren Units gebraucht werden gehören in eine eigene Unit:
Delphi-Quellcode:
Unitx
 blablabla

Unit1
  uses unitx;

unit2
  uses unitx;

Unit3
  uses unitx;

etc.
Und was Deine Doppelsuche angeht, es wäre wahrscheinlich besser die Daten in einer nonvisuellen Komponente/Struktur zu bevorraten (z.B. Array of Record), dort die Suche/ den Vergleich durchzuführen, in dieser oder einer zweiten Struktur die entsprechenden Informationen/Markierungen zu hinterlegen und diese dann in einem Grid anzuzeigen.
(aber das wurde glaub ich auch schon vorgeschlagen)

Gruß
K-H

Simo 2. Mai 2014 14:41

AW: Spalten überprüfen...
 
Vielen Danke für die Antwort..-)

Wie gesagt Der Editor war schon programmiert (Nicht von mir.. bin noch ein Anfänger). Mit dem Editor kann man Dateien öffnen und sie mit den Funktionen Suchen/Ersetzen, finden...bearbeiten.
Die erste Aufgabe war : dem Projekt eine neue Unit hinzufügen und eine Funktion schreiben, die die erste Spalte auf doppelter Eintrag überprüft und wenn ein Doppelter Eintrag vorkommt, eine Fehlermeldung wird ausgegeben. Das war einfach
Ich habe sie programmiert.. (Ob Cells[0,a]=Cells[0,c]).. das war ja einfach. Dann zwei andere Funktionen.

die zweite Aufgabe : Es soll die einzelnen Spalten mit den unterschiedlichen Inhalten der (verschiedenen) Tabellen überprüft werden.
Anforderungen : Eine neue Formular zu erstellen, Da kann man die Regeln definieren (im ComboBox1 : MyRegeln1..MyRegeln9) ist aber egal. im GroupBox sind 15 ComboBoxen mit den gleichen Items (Funktionen). ComboBox1 für Spalte1.. ComboBox2 für Spalte2..usw. Da wird eingestellt welche Überprüfung für welche Spalte..

In der schon programmierten Unit (unit1) des Editors muss beim Prozedur SpeichernClick die Abfrage gemacht. Denn wenn ich in der Tabelle was bearbeitet habe und im Menu über Datei : Speichern klicke
soll die Überprüfung durchgeführt und eine Fehlermeldung ausgegeben werden.

Leider kann ich das nicht anders machen und muss meine Funktion/Funktionen umprogrammieren dass sie von der Einstellung der ComboBoxen abhängig werden.Und weiss nicht wo ich genau die Abfragen tue..


Zu Unit1 : wo die Funktion/Funktionen sind.

Delphi-Quellcode:
function TMyChek.MyChekGleich(StringGrid:TggStringGrid; Spaltennummer:Integer):Integer ;
//wobei ich die Funktion umbennenen würde, in das was sie macht, nämlich die erste Zeile liefern, //in der was doppelt vorkommt also somit sowas wie:
//function TMyChek.GetFirstRepetition(StringGrid:TggStringGrid; Spaltennummer:Integer):Integer ;
var
  a , b ,c : integer;
  Inhalt_Check : string;
  iDoppeltcounter:integer;
begin
  iDoppeltcounter:=0;
  Result:=0;//Ich würde sagen, wenn 0 zurückkommt, gibt es keine Doppelten

  b:= StringGrid.RowCount; // Anzahl der Zeilen...

  for a:=0 to b do begin //müsste meiner Meinung nach b-1 sein
    Inhalt_Check:=StringGrid.Cells[Spaltennummer,a]; //Zeile Um 1 erhöhen...
     for c:=0 to b do begin //b-1 s.o.?
        if Inhalt_Check=StringGrid.Cells[Spaltennummer,c] then begin
           //iDoppeltcounter:=iDoppeltcounter+1;
           Inc(iDoppeltcounter);
             if iDoppeltcounter>1 then begin
                 Result:=c;
                 //StringGrid.Selection:=
                 exit;
                 iDoppeltcounter:=0;
             end;
        end;
     end;
  end;
end;
Zu Unit2 : Code+Design

Delphi-Quellcode:
 type
    Regel = record
      Spalte : Array [1..15] of string ;
      Kriterium : string ;
    end;

    const MaxAnzahlRegeln=9;
    const SpaltenAnzahl=15;

    var
    MyRegeln : Array [1..MaxAnzahlRegeln] of Regel;

Delphi-Quellcode:
type
TFMRegeln = class(TForm)
    Label1: TLabel;
    ...
    Label15:TLabel;
    ...
    ComboBox1 :TComboBox;
    ...


procedure ComboBoxChangeAlg(Sender: TObject);//Hier habe ich in Ereignisse [B]Onchange[/B] 'ComboBoxChangeAlg' für alle ComboBoxen gemacht, damit ich nur ein Prozedur dann habe..


// Zuweisung des ausgewählten Textes der ComboBoxen... Tag:1,2.. 15
procedure TFMRegeln.ComboBoxChangeAlg(Sender: TObject);

begin
  MyRegeln[STrToInt(ComboBox1.Text)].Spalte[(Sender as TComboBox).Tag]:=(Sender as TComboBox).Text;
end;


[B]Zu Unit3, wo alles programmiert ist (nicht von mir).[/B

Delphi-Quellcode:
...
...
///////////////////////////////////////////////////////////////////////////////
////////////////////////// XML File speichern
procedure TForm1.Speichern1Click(Sender: TObject);
var
  MyXML:TBATM4XMLClass;
  i,r,S:integer;
  MyCheck:TMyChek;
  iResult:integer;
  b : Boolean;

begin


  MyCheck:=TMyChek.Create;
  iResult:=MyCheck.MyChekGleich(MainGrid);

  b:=MyCheck.MyChekFloat('10');
  //b:=MyCheck.MyChekInteger('10.4') ;

  if iResult<>-3 then begin
     Showmessage(' Doppelter Eintrag : ' + IntTostr(iResult));

  Freeandnil(MyCheck);



  if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'TXT' then begin
    SavetextFile();
  end else begin
    if Fileexists(Filename) then begin
      if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'TXT' then begin
        SavetextFile();
      end;
      if UPPERCASE(copy(Filename,length(Filename)-2,3)) = 'XML' then begin
        SaveXMLFile();
      end;
    end;
  end;
end;
...
...

Das sind 3 verschiedene Units.. Was soll ich korrigieren? Wie kann ich diese Variable 'Tag' der ComboBoxen ausnutzen, dass meine Funktion es erst nach der Einstellung tut!!

Vlt störe ich oder verstehe nicht ganz was ihr vorschlägt.. .Ich bin noch ein Anfänger in Delphi und versuche mich einzuarbeiten und hoffe auf Ihr Verständnis..

Ich wäre sehr dankbar wenn Sie mir helfen können, dass ich es nicht alles ändern muss..

LG

Jumpy 2. Mai 2014 14:58

AW: Spalten überprüfen...
 
Wenn du immer nur den selben Kram postest, mit Doppelposts pushst usw., dann verlier ich auch irgendwie die Lust zu helfen, schließlich ist es hier im Forum auch nicht üblich die Hausaufgaben komplett zu machen. Daher hier mal mein letzter Ansatz, danach musst du allein weiter machen:
(ist ungetestet, da nur hier in den Editor getippt)


Unit 1: Checkfunktionen:
Delphi-Quellcode:
unit MyChkXML;

interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes,Forms, Dialogs, ExtCtrls,
     StdCtrls, Buttons,ggStringGrid,Grids ;

type
  TCheck = Record
    Column:integer;
    Rule:integer;
  end;

  TChecklist = array of TCheck;

  TMyChek = class
  private
    MSG:TStringlist;
    Checklist:TChecklist;
    Grid:TStringGrid;

    function Check(Checknumber:Integer):Boolean;
    function MyChekGleich(Column:Integer):Boolean;
    function MyChekInteger(Column:Integer):Boolean;
    function MyChekFloat(Column:Integer) :Boolean;
  public
    procedure AddCheck(Column,Rulenumber);
    function ExecuteCheck:Boolean;
    function CheckResults:String;
    constructor create(AGrid:TStringGrid);
    destructor destroy;
  end;

implementation

constructor TMyChek.Create(AGrid:TStringGrid);
begin
  inherited create;
  Grid:=AGrid;
  MSG:=TStringlist.create;
end;

desctructor TMyChek.Destroy();
begin
  MSG.Free;
  inherited;
end;

procedure TMyChek.AddCheck(Column,Rulenumber);
begin
  SetLength(Checklist,Length(Checklist)+1);
  Checklist[High(Checklist)].Column:=Column;
  Checklist[High(Checklist)].Rule:=Rulenumber;
end;

function TMyChek.ExecuteCheck:Boolean;
var i:integer;
begin
  Result:=true;
  for i:=Low(Checklist) to High(Checklist) do
    if not Check(i) then
      Result:=false;
end;

function TMyChek.Check(Checknumber):Boolean;
begin
  if Checklist[i].Rule = 0 then
    Result:=MyChekGleich(Checklist[i].Column)
  else if Checklist[i].Rule = 1 then
    Result:=MyChekInteger(Checklist[i].Column)
  else if Checklist[i].Rule = 2 then
    Result:=MyChekFloat(Checklist[i].Column)
  else
    Result:=true; //Keine bekannte Regel, dann immer OK
end;

function TMyChek.MyChekInteger(Column:Integer):Boolean;
var i:Integer;
    input:String;
    output:integer;
begin
  Result:=true;
  for i:=0 to Grid.Rows-1 do //Grid.Rows.Count-1 ???
    begin
    input:=Grid.Cells[Column,i];
    if not TryStrToFloat(input,output) then
      begin
      if Result then
        MSG.Add('Spalte: '+IntToStr(Column)+', Regel: 1 (CheckInteger)')
      MSG.Add('Fehler in Reihe '+IntToStr(i)+': '+input)
      Result:=false;
      end;
    end;
end;

function TMyChek.MyChekFloat(Column:Integer): Boolean;
begin
  //Analog
end;

function TMyChek.MyChekGleich(Column:Integer):Booelean ;
begin
  //Schon was schwieriger, aber solltest du auch hinkriegen.
end;

end.
Zu Problem Nr. 2 schau dir wie gesagt mal das Ini-Tutorial an.

Viel Erfolg, ich bin raus.

Simo 5. Mai 2014 06:55

AW: Spalten überprüfen...
 
Vielen Dank Ralph

Ja du hast recht..sorry
Ich versuche es jetzt allein..

Danke alle für Ihre Hilfe..-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz