Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2015
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 22.56 KB | None | 0 0
  1. unit BaumKlasseUnit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections,
  8.   Vcl.ComCtrls;
  9.  
  10. type
  11.   PNode = ^TNodeTest;
  12.  
  13.   TNodeTest = class
  14.     private
  15.       FDaten: String;
  16.       FLinks: PNode;
  17.       FRechts: PNode;
  18.       FTreeNode: TTreeNode;
  19.     public
  20.       constructor Create;
  21.   end;
  22.  
  23.   TForm4 = class(TForm)
  24.     Lb_Ausgabe: TLabel;
  25.     Ed_Eingabe: TEdit;
  26.     Bt_Einfuegen: TButton;
  27.     Bt_Links: TButton;
  28.     Bt_Rechts: TButton;
  29.     Bt_Loeschen: TButton;
  30.     Bt_Wurzel: TButton;
  31.     Bt_Aendern: TButton;
  32.     Bt_NodeZaehlen: TButton;
  33.     Bt_BlaetterZaehlen: TButton;
  34.     Bt_Tiefe: TButton;
  35.     TV: TTreeView;
  36.     procedure FormCreate(Sender: TObject);
  37.     procedure Bt_EinfuegenClick(Sender: TObject);
  38.     procedure Bt_RechtsClick(Sender: TObject);
  39.     procedure Bt_WurzelClick(Sender: TObject);
  40.     procedure StatusBt;
  41.     procedure Bt_LoeschenClick(Sender: TObject);
  42.     procedure Bt_AendernClick(Sender: TObject);
  43.     procedure Einfuegen(eingabe: String);
  44.     procedure SetErgebnis(daten: TStringList);
  45.     procedure Bt_NodeZaehlenClick(Sender: TObject);
  46.     procedure Bt_BlaetterZaehlenClick(Sender: TObject);
  47.     function GetErgebnis(): TStringList;
  48.     function Durchgelaufen(): Boolean;
  49.     function Hoehe(p: PNode): Integer;
  50.     procedure Bt_TiefeClick(Sender: TObject);
  51.     procedure Ed_EingabeKeyPress(Sender: TObject; var Key: Char);
  52.     procedure TVMouseUp(Sender: TObject; Button: TMouseButton;
  53.       Shift: TShiftState; X, Y: Integer);
  54.     procedure AktuallisiereMaus;
  55.     procedure Bt_LinksClick(Sender: TObject);
  56.     procedure EinzelnerKnotenLoeschen;
  57.   private
  58.     { Private-Deklarationen }
  59.     {PWurzelNode: PNode;
  60.     PStandNode: PNode;
  61.     PParentNode: PNode;
  62.     eingegeben, bearbeiten: Boolean;}
  63.     PWurzelNode: PNode;
  64.     PStandNode: PNode;
  65.     PParentNode: PNode;
  66.     eingegeben, bearbeiten: Boolean;
  67.   public
  68.     { Public-Deklarationen }
  69.   end;
  70.  
  71. var
  72.   Form4: TForm4;
  73.  
  74. implementation
  75.  
  76. {$R *.dfm}
  77.  
  78. constructor TNodeTest.Create;
  79. begin
  80.   inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
  81. end;
  82.  
  83. procedure TForm4.Bt_AendernClick(Sender: TObject);
  84. var
  85.   eingabe: String;
  86. begin
  87.   if Tag = 0 then
  88.   begin
  89.     Ed_Eingabe.Text := PStandNode.FDaten;
  90.     (Sender as TButton).Caption := 'Ändern (Reinschreiben)';
  91.     Tag := 1;
  92.     bearbeiten := True;
  93.   end
  94.   else if Tag = 1 then
  95.   begin
  96.     eingabe := Ed_Eingabe.Text;
  97.     EinzelnerKnotenLoeschen;
  98.     Einfuegen(eingabe);
  99.     Ed_Eingabe.Text := '';
  100.     (Sender as TButton).Caption := 'Ändern (Einlesen)';
  101.     Tag := 0;
  102.     bearbeiten := False;
  103.   end;
  104. end;
  105.  
  106. procedure TForm4.Bt_BlaetterZaehlenClick(Sender: TObject);
  107. var
  108.   Stack: TStack<PNode>;
  109.   PBufferNode: PNode;
  110.   i: Integer;
  111. begin
  112.   if PWurzelNode <> nil then
  113.   begin
  114.     Stack := TStack<PNode>.Create;
  115.     i := 0;
  116.     PBufferNode := PWurzelNode;
  117.     if ((PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil)) then
  118.     begin
  119.       Stack.Push(PBufferNode);
  120.       PBufferNode := PBufferNode.FLinks;
  121.     end;
  122.     if Stack.Count <> 0 then
  123.     begin
  124.       repeat
  125.       begin
  126.         if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
  127.         begin
  128.           if (Stack.Count = 0) or (Stack.Peek <> PBufferNode) then
  129.           begin
  130.             Stack.Push(PBufferNode);
  131.           end;
  132.           PBufferNode := PBufferNode.FLinks;
  133.         end
  134.         else if PBufferNode.FRechts <> nil then
  135.         begin
  136.           PBufferNode := PBufferNode.FRechts;
  137.         end
  138.         else if PBufferNode.FLinks <> nil then
  139.         begin
  140.           PBufferNode := PBufferNode.FLinks;
  141.         end
  142.         else
  143.         begin
  144.           Inc(i);
  145.           PBufferNode := Stack.Peek;
  146.           Stack.Extract;
  147.           Stack.TrimExcess;
  148.           PBufferNode := PBufferNode.FRechts;
  149.           if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
  150.           begin
  151.             Stack.Push(PBufferNode);
  152.           end;
  153.         end;
  154.       end;
  155.       until Stack.Count = 0;
  156.     end;
  157.     if (PBufferNode.FLinks = nil) and (PBufferNode.FRechts = nil) then
  158.     begin
  159.       Inc(i);
  160.     end;
  161.     Stack.Clear;
  162.     Stack.Free;
  163.     if i = 1 then
  164.     begin
  165.       ShowMessage('Es gibt ' + IntToStr(i) + ' Blatt!');
  166.     end
  167.     else
  168.     begin
  169.       ShowMessage('Es gibt ' + IntToStr(i) + ' Blätter!');
  170.     end;
  171.   end;
  172. end;
  173.  
  174. procedure TForm4.Bt_EinfuegenClick(Sender: TObject);
  175. begin
  176.   Einfuegen(Ed_Eingabe.Text);
  177.   //TVEinfuegen(Ed_Eingabe.Text);
  178.   Ed_Eingabe.Text := '';
  179.   Ed_Eingabe.SetFocus;
  180. end;
  181.  
  182. procedure TForm4.Ed_EingabeKeyPress(Sender: TObject; var Key: Char);
  183. begin
  184.   if Key = #13 then
  185.   begin
  186.     if bearbeiten then
  187.     begin
  188.       Bt_Aendern.Click;
  189.     end
  190.     else
  191.     begin
  192.       Bt_Einfuegen.Click;
  193.     end;
  194.     Key := #0; //Ist das nötig?
  195.   end;
  196. end;
  197.  
  198. procedure TForm4.Einfuegen;
  199. var
  200.   PCurrentNode: PNode;
  201.   TCurrentNodeTest: TNodeTest;
  202.   PBufferNode: PNode;
  203.   durchlaufe: Boolean;
  204. begin
  205. //  PCurrentNode := nil;
  206.   TCurrentNodeTest := TNodeTest.Create; //Neuer Node erzeugen
  207.   New(PCurrentNode);
  208.   PCurrentNode.FDaten := eingabe;
  209.   PCurrentNode.FLinks := nil;
  210.   PCurrentNode.FRechts := nil;
  211.   PBufferNode := PWurzelNode;
  212.   if PWurzelNode = nil then
  213.   begin
  214.     PWurzelNode := PCurrentNode;
  215.     PWurzelNode.FTreeNode := TV.Items.AddChildObject(nil, 'Wurzel: ' + PWurzelNode.FDaten, PWurzelNode);
  216.     PStandNode := PWurzelNode;
  217.     Lb_Ausgabe.Caption := PWurzelNode.FDaten;
  218.     Bt_Wurzel.Enabled := True;
  219.   end
  220.   else
  221.   begin
  222.     durchlaufe := True;
  223.     while durchlaufe do
  224.     begin
  225.       if (eingabe <= PBufferNode.FDaten) and (PBufferNode.FLinks <> nil) then
  226.       begin
  227.         PBufferNode := PBufferNode.FLinks;
  228.       end
  229.       else if (eingabe > PBufferNode.FDaten) and (PBufferNode.FRechts <> nil) then
  230.       begin
  231.         PBufferNode := PBufferNode.FRechts;
  232.       end
  233.       else
  234.       begin
  235.         durchlaufe := False;
  236.       end;
  237.     end;
  238.     if PBufferNode.FDaten >= eingabe then
  239.     begin
  240.       PCurrentNode.FTreeNode := TV.Items.AddChildObject(PBufferNode.FTreeNode, 'l: ' + PCurrentNode.FDaten, PCurrentNode);
  241.       PBufferNode.FLinks := PCurrentNode;
  242.     end
  243.     else
  244.     begin
  245.       PCurrentNode.FTreeNode := TV.Items.AddChildObjectFirst(PBufferNode.FTreeNode, 'r: ' + PCurrentNode.FDaten, PCurrentNode);
  246.       PBufferNode.FRechts := PCurrentNode;
  247.     end;
  248.   end;
  249.   StatusBt;
  250.   TV.FullExpand;
  251. end;
  252.  
  253. procedure TForm4.Bt_LinksClick(Sender: TObject);
  254. begin
  255.   PStandNode.FTreeNode.Selected := False;
  256.   PParentNode := PStandNode;
  257.   PStandNode := PStandNode.FLinks;
  258.   PStandNode.FTreeNode.Selected := True;
  259.   Lb_Ausgabe.Caption := PStandNode.FDaten;
  260.   StatusBt;
  261. end;
  262.  
  263. procedure TForm4.Bt_LoeschenClick(Sender: TObject);
  264. var
  265.   BufferStack: TStack<PNode>;
  266.   Stack: TStack<PNode>;
  267.   PBufferNode: PNode;
  268.   rl: Char;
  269. begin
  270.   if PStandNode = PWurzelNode then
  271.   begin
  272.     ShowMessage('Du kannst die Wurzel nicht löschen!');
  273.   end
  274.   else
  275.   begin
  276.     PBufferNode := PParentNode;
  277.     if (PStandNode.FLinks <> nil) or (PStandNode.FRechts <> nil) then
  278.     begin
  279.       if MessageBox(Handle,'Ganzer Teilbaum löschen?','Bestätigen',MB_YESNO) = IDNO then
  280.       begin
  281.         if MessageBox(Handle, 'Einzelner Knoten löschen?', 'Bestätigen', MB_YESNO) = IDYES then
  282.         begin
  283.           //Methode zum löschen des einzelnen Knotens
  284.           EinzelnerKnotenLoeschen;
  285.           Exit;
  286.         end;
  287.         MessageDlg('Löschen wurde abgebrochen!', mtInformation,[mbOk], 0, mbOk);
  288.         Exit;
  289.       end;
  290.     end;
  291.     if PParentNode.FLinks = PStandNode then
  292.     begin
  293.       rl := 'l';
  294.     end
  295.     else if PParentNode.FRechts = PStandNode then
  296.     begin
  297.       rl := 'r';
  298.     end;
  299.     if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
  300.     begin
  301.       BufferStack := TStack<PNode>.Create;
  302.       Stack := TStack<PNode>.Create;
  303.       BufferStack.Push(PStandNode);
  304.       Stack.Push(PStandNode);
  305.       PStandNode := PStandNode.FLinks;
  306.       BufferStack.Push(PStandNode);
  307.       if Stack.Count <> 0 then
  308.       begin
  309.         repeat
  310.         begin
  311.           if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
  312.           begin
  313.             if Stack.Peek <> PStandNode then
  314.             begin
  315.               Stack.Push(PStandNode);
  316.             end;
  317.             PStandNode := PStandNode.FLinks;
  318.           end
  319.           else if PStandNode.FRechts <> nil then
  320.           begin
  321.             PStandNode := PStandNode.FRechts;
  322.           end
  323.           else if PStandNode.FLinks <> nil then
  324.           begin
  325.             PStandNode := PStandNode.FLinks;
  326.           end
  327.           else
  328.           begin
  329.             PStandNode := Stack.Peek;
  330.             Stack.Extract;
  331.             Stack.TrimExcess;
  332.             PStandNode := PStandNode.FRechts;
  333.             if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
  334.             begin
  335.               Stack.Push(PStandNode);
  336.             end;
  337.           end;
  338.           BufferStack.Push(PStandNode);
  339.         end;
  340.         until Stack.Count = 0;
  341.       end;
  342.       Stack.Clear;
  343.       Stack.Free;
  344.       while BufferStack.Count <> 0 do
  345.       begin
  346.         //Nehme aus BufferStack und lösche (+TTreeView)
  347.         PStandNode := BufferStack.Peek;
  348.         BufferStack.Extract;
  349.         BufferStack.TrimExcess;
  350.         TV.Items.Delete(PStandNode.FTreeNode);
  351.         PStandNode.FTreeNode := nil;
  352.         PStandNode.Flinks := nil;
  353.         PStandNode.Frechts := nil;
  354.         FreeAndNil(PStandNode);
  355.       end;
  356.       BufferStack.Clear;
  357.       BufferStack.Free;
  358.     end;
  359.     if (PBufferNode.FLinks <> nil) and (rl = 'l') then
  360.     begin
  361.       if PBufferNode.FLinks.FDaten = '' then
  362.       begin
  363.         PBufferNode.FLinks := nil;
  364.       end
  365.       else
  366.       begin
  367.         PBufferNode.FTreeNode.Selected := False;
  368.         TV.Items.Delete(PBufferNode.FLinks.FTreeNode);
  369.         PBufferNode.FLinks.FTreeNode := nil;
  370.         PBufferNode.FLinks.FLinks := nil;
  371.         PBufferNode.FLinks.FRechts := nil;
  372.         FreeAndNil(PBufferNode.FLinks);
  373.         PBufferNode.FLinks := nil;
  374.       end;
  375.     end;
  376.     if (PBufferNode.FRechts <> nil) and (rl = 'r') then
  377.     begin
  378.       if PBufferNode.FRechts.FDaten = '' then
  379.       begin
  380.         PBufferNode.FRechts := nil;
  381.       end
  382.       else
  383.       begin
  384.         PBufferNode.FTreeNode.Selected := False;
  385.         TV.Items.Delete(PBufferNode.FRechts.FTreeNode);
  386.         PBufferNode.FRechts.FTreeNode := nil;
  387.         PBufferNode.FRechts.FLinks := nil;
  388.         PBufferNode.FRechts.FRechts := nil;
  389.         FreeAndNil(PBufferNode.FRechts);
  390.         PBufferNode.FRechts := nil;
  391.       end;
  392.     end;
  393.     PStandNode := PWurzelNode;
  394.     PStandNode.FTreeNode.Selected := True;
  395.     Lb_Ausgabe.Caption := PStandNode.FDaten;
  396.     StatusBt;
  397.   end;
  398. end;
  399.  
  400.  
  401. {begin
  402.   if PStandNode = PParentNode.rechts then
  403.   begin
  404.     TV.Items.Delete(PStandNode.TreeNode);
  405.     PStandNode.TreeNode := nil;
  406.     PParentNode.rechts := nil;
  407.   end
  408.   else if PStandNode = PParentNode.links then
  409.   begin
  410.     PParentNode.links := nil;
  411.     TV.Items.Delete(PStandNode.TreeNode);
  412.     PStandNode.TreeNode := nil;
  413.   end;
  414.   if (PParentNode = PWurzelNode) or not ((PParentNode.rechts = nil) and (PParentNode.links = nil)) then
  415.   begin
  416.     Dec(BlaetterZaehlen);
  417.   end;
  418.   FreeAndNil(PStandNode);
  419.   PStandNode := PWurzelNode;
  420.   Lb_Ausgabe.Caption := PStandNode.daten;
  421.   StatusBt;
  422.   Dec(NodeZaehlen);
  423. end;       }
  424.  
  425. procedure TForm4.EinzelnerKnotenLoeschen;
  426. var
  427.   rl: Char;
  428.   PStandBufferNode: PNode;
  429.   TStandBufferNode: TNodeTest;
  430.   BufferStack: TStack<PNode>;
  431.   Stack: TStack<PNode>;
  432.   BufferTextStack: TStack<String>;
  433. begin
  434.   TStandBufferNode := TNodeTest.Create;
  435.   PStandBufferNode.FRechts := PStandNode.FRechts;
  436.   PStandBufferNode.FLinks := PStandNode.FLinks;
  437.   if PStandNode = PParentNode.FLinks then
  438.   begin
  439.     rl := 'l';
  440.   end
  441.   else if PStandNode = PParentNode.FRechts then
  442.   begin
  443.     rl := 'r';
  444.   end;
  445.   if rl = 'r' then
  446.   begin
  447.     PStandNode := PStandNode.FLinks;
  448.   end
  449.   else if rl = 'l' then
  450.   begin
  451.     PStandNode := PStandNode.FRechts;
  452.   end;
  453.   if (PStandNode.FLinks = nil) or (PStandNode.FRechts = nil) then
  454.   begin
  455.     BufferTextStack := TStack<String>.Create;
  456.     BufferTextStack.Push(PStandNode.FDaten);
  457.   end
  458.   else if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
  459.   begin
  460.     BufferStack := TStack<PNode>.Create;
  461.     BufferTextStack := TStack<String>.Create;
  462.     Stack := TStack<PNode>.Create;
  463.     BufferStack.Push(PStandNode);
  464.     BufferTextStack.Push(PStandNode.FDaten);
  465.     Stack.Push(PStandNode);
  466.     PStandNode := PStandNode.FLinks;
  467.     BufferStack.Push(PStandNode);
  468.     BufferTextStack.Push(PStandNode.FDaten);
  469.     if Stack.Count <> 0 then
  470.     begin
  471.       repeat
  472.       begin
  473.         if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) then
  474.         begin
  475.           if Stack.Peek <> PStandNode then
  476.           begin
  477.             Stack.Push(PStandNode);
  478.           end;
  479.           PStandNode := PStandNode.FLinks;
  480.         end
  481.         else if PStandNode.FRechts <> nil then
  482.         begin
  483.           PStandNode := PStandNode.FRechts;
  484.         end
  485.         else if PStandNode.FLinks <> nil then
  486.         begin
  487.           PStandNode := PStandNode.FLinks;
  488.         end
  489.         else
  490.         begin
  491.           PStandNode := Stack.Peek;
  492.           Stack.Extract;
  493.           Stack.TrimExcess;
  494.           PStandNode := PStandNode.FRechts;
  495.           if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
  496.           begin
  497.             Stack.Push(PStandNode);
  498.           end;
  499.         end;
  500.         BufferStack.Push(PStandNode);
  501.         BufferTextStack.Push(PStandNode.FDaten);
  502.       end;
  503.       until Stack.Count = 0;
  504.     end;
  505.     Stack.Clear;
  506.     Stack.Free;
  507.     while BufferStack.Count <> 0 do
  508.     begin
  509.       //Nehme aus BufferStack und lösche (+TTreeView)
  510.       PStandNode := BufferStack.Peek;
  511.       BufferStack.Extract;
  512.       BufferStack.TrimExcess;
  513.       TV.Items.Delete(PStandNode.FTreeNode);
  514.       PStandNode.FTreeNode := nil;
  515.       PStandNode.FLinks := nil;
  516.       PStandNode.FRechts := nil;
  517.       FreeAndNil(PStandNode);
  518.     end;
  519.     BufferStack.Clear;
  520.     BufferStack.Free;
  521.   end;
  522.   if rl = 'r' then
  523.   begin
  524.     if PStandNode.FRechts <> nil then
  525.     begin
  526.       PStandBufferNode.FRechts.FTreeNode.MoveTo(PParentNode.FTreeNode, naAddChildFirst);   //Nicht löschen, sondern so wie unten
  527.     end;
  528.     TV.Items.Delete(PParentNode.FRechts.FTreeNode);
  529.     PParentNode.FRechts := PStandBufferNode.FRechts;
  530.   end
  531.   else if rl = 'l' then
  532.   begin
  533.     if PStandBufferNode.FLinks <> nil then
  534.     begin
  535.       PStandBufferNode.FLinks.FTreeNode.MoveTo(PParentNode.FTreeNode, naAddChild);
  536.     end;
  537.     TV.Items.Delete(PParentNode.FLinks.FTreeNode);
  538.     PParentNode.FLinks := PStandBufferNode.FLinks;
  539.   end
  540.   else
  541.   begin
  542.     ShowMessage(' (rl <> r) and (rl <> l)');
  543.   end;
  544.   while BufferTextStack.Count <> 0 do
  545.   begin
  546.     Einfuegen(BufferTextStack.Peek);
  547.     BufferTextStack.Extract;
  548.     BufferTextStack.TrimExcess;
  549.   end;
  550.   if BufferTextStack <> nil then
  551.   begin
  552.     BufferTextStack.Clear;
  553.     BufferTextStack.Free;
  554.   end;
  555.   FreeAndNil(TStandBufferNode);
  556.   PStandNode := PWurzelNode;
  557.   PStandNode.FTreeNode.Selected := True;
  558.   Lb_Ausgabe.Caption := PStandNode.FDaten;
  559.   StatusBt;
  560. end;
  561.  
  562. procedure TForm4.Bt_NodeZaehlenClick(Sender: TObject);
  563. var
  564.   Stack: TStack<PNode>;
  565.   PBufferNode: PNode;
  566.   i: Integer;
  567. begin
  568.   if PWurzelNode <> nil then
  569.   begin
  570.     Stack := TStack<PNode>.Create;
  571.     i := 0;
  572.     PBufferNode := PWurzelNode;
  573.     Inc(i);
  574.     if ((PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil)) then
  575.     begin
  576.       Stack.Push(PBufferNode);
  577.       PBufferNode := PBufferNode.FLinks;
  578.       Inc(i);
  579.     end;
  580.     if Stack.Count <> 0 then
  581.     begin
  582.       repeat
  583.       begin
  584.         if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
  585.         begin
  586.           if (Stack.Count = 0) or (Stack.Peek <> PBufferNode) then
  587.           begin
  588.             Stack.Push(PBufferNode);
  589.           end;
  590.           PBufferNode := PBufferNode.FLinks;
  591.         end
  592.         else if PBufferNode.FRechts <> nil then
  593.         begin
  594.           PBufferNode := PBufferNode.FRechts;
  595.         end
  596.         else if PBufferNode.FLinks <> nil then
  597.         begin
  598.           PBufferNode := PBufferNode.FLinks;
  599.         end
  600.         else
  601.         begin
  602.           PBufferNode := Stack.Peek;
  603.           Stack.Extract;
  604.           Stack.TrimExcess;
  605.           PBufferNode := PBufferNode.FRechts;
  606.           if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
  607.           begin
  608.             Stack.Push(PBufferNode);
  609.           end;
  610.         end;
  611.         Inc(i);
  612.       end;
  613.       until Stack.Count = 0;
  614.     end;
  615.     Stack.Clear;
  616.     Stack.Free;
  617.     ShowMessage('Es gibt ' + IntToStr(i) + ' Knoten');
  618.   end
  619.   else
  620.   begin
  621.     ShowMessage('Es gibt 0 Knoten');
  622.   end;
  623. end;
  624.  
  625. procedure TForm4.Bt_RechtsClick(Sender: TObject);
  626. begin
  627.   PStandNode.FTreeNode.Selected := False;
  628.   PParentNode := PStandNode;
  629.   PStandNode := PStandNode.FRechts;
  630.   PStandNode.FTreeNode.Selected := True;
  631.   Lb_Ausgabe.Caption := PStandNode.FDaten;
  632.   StatusBt;
  633. end;
  634.  
  635. procedure TForm4.Bt_TiefeClick(Sender: TObject);
  636. begin
  637.   ShowMessage('Tiefe: ' + IntToStr(Hoehe(PWurzelNode)));
  638. end;
  639.  
  640. procedure TForm4.Bt_WurzelClick(Sender: TObject);
  641. begin
  642.   PStandNode.FTreeNode.Selected := False;
  643.   PStandNode := PWurzelNode;
  644.   Lb_Ausgabe.Caption := PStandNode.FDaten;
  645.   StatusBt;
  646.   PParentNode := nil;
  647.   PStandNode.FTreeNode.Selected := True;
  648. end;
  649.  
  650. procedure TForm4.FormCreate(Sender: TObject);
  651. begin
  652.   Bt_Links.Enabled := False;
  653.   Bt_Rechts.Enabled := False;
  654.   Bt_Wurzel.Enabled := False;
  655.   Bt_Aendern.Enabled := False;
  656.   PWurzelNode := nil;
  657.   PStandNode := nil;
  658.   PParentNode := nil;
  659.   Tag := 0;
  660.   //AUF 42 ZEICHEN BESCHRÄNKEN
  661.   Ed_Eingabe.MaxLength := 42;
  662.   TV.HideSelection := False;
  663.   TV.FullExpand;
  664. end;
  665.  
  666. procedure TForm4.StatusBt;
  667. begin
  668.   Bt_Links.Enabled := PStandNode.FLinks <> nil;
  669.   Bt_Rechts.Enabled := PStandNode.FRechts <> nil;
  670.   Bt_Aendern.Enabled := PWurzelNode <> nil;
  671. end;
  672.  
  673. procedure TForm4.TVMouseUp(Sender: TObject; Button: TMouseButton;
  674.   Shift: TShiftState; X, Y: Integer);
  675. begin
  676.   if (TV.Selected <> nil) and (TV.Selected <> PStandNode.FTreeNode) then
  677.   begin
  678.     AktuallisiereMaus; //Nach PNode suchen, welches PNode.TreeNode = TV.Selected hat und PStandNode := PNode(Buffer) und Anzeige, Buttons,... aktuallisieren
  679.   end;
  680. end;
  681.  
  682. procedure TForm4.AktuallisiereMaus;
  683. var
  684.   Stack: TStack<PNode>;
  685. begin
  686.   if PWurzelNode <> nil then
  687.   begin
  688.     PStandNode.FTreeNode.Selected := False;
  689.     PParentNode := nil;
  690.     Stack := TStack<PNode>.Create;
  691.     PStandNode := PWurzelNode;
  692.     if ((PStandNode.Flinks <> nil) and (PStandNode.FRechts <> nil)) and (PStandNode.FTreeNode <> TV.Selected) then
  693.     begin
  694.       Stack.Push(PStandNode);
  695.       PParentNode := PStandNode;
  696.       PStandNode := PStandNode.FLinks;
  697.     end;
  698.     if PStandNode.FTreeNode <> TV.Selected then
  699.     begin
  700.       repeat
  701.       begin
  702.         if ((PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil)) and (PStandNode.FTreeNode <> TV.Selected) then
  703.         begin
  704.           if (Stack.Count = 0) or (Stack.Peek <> PStandNode) then
  705.           begin
  706.             Stack.Push(PStandNode);
  707.           end;
  708.           PParentNode := PStandNode;
  709.           PStandNode := PStandNode.FLinks;
  710.         end
  711.         else if PStandNode.FRechts <> nil then
  712.         begin
  713.           PParentNode := PStandNode;
  714.           PStandNode := PStandNode.FRechts;
  715.         end
  716.         else if PStandNode.FLinks <> nil then
  717.         begin
  718.           PParentNode := PStandNode;
  719.           PStandNode := PStandNode.FLinks;
  720.         end
  721.         else
  722.         begin
  723.           PStandNode := Stack.Peek;
  724.           Stack.Extract;
  725.           Stack.TrimExcess;
  726.           PParentNode := PStandNode;
  727.           PStandNode := PStandNode.FRechts;
  728.           if (PStandNode.FLinks <> nil) and (PStandNode.FRechts <> nil) then
  729.           begin
  730.             Stack.Push(PStandNode);
  731.           end;
  732.         end;
  733.       end;
  734.       until PStandNode.FTreeNode = TV.Selected;
  735.     end;
  736.       Stack.Clear;
  737.       Stack.Free;
  738.       PStandNode.FTreeNode.Selected := True;
  739.       Lb_Ausgabe.Caption := PStandNode.FDaten;
  740.       StatusBt;
  741.   end;
  742. end;
  743.  
  744. function TForm4.Hoehe;
  745. var
  746.   links, rechts: Integer;
  747. begin
  748.   if p = nil then
  749.   begin
  750.     result := 0;
  751.   end
  752.   else
  753.   begin
  754.     links := Hoehe(p.FLinks) + 1 ;
  755.     rechts := Hoehe(p.FRechts) + 1;
  756.     if rechts > links then
  757.     begin
  758.       result := rechts;
  759.     end
  760.     else
  761.     begin
  762.       result := links;
  763.     end;
  764.   end;
  765. end;
  766.  
  767. function TForm4.GetErgebnis;
  768. var
  769.   ergebnis: TStringList;
  770.   Stack: TStack<PNode>;
  771.   PBufferNode: PNode;
  772. begin
  773.   ergebnis := TStringList.Create;
  774.   if PWurzelNode <> nil then
  775.   begin
  776.     eingegeben := True;
  777.     Stack := TStack<PNode>.Create;
  778.     ergebnis := TStringList.Create;
  779.     PBufferNode := PWurzelNode;
  780.     ergebnis.Add(PBufferNode.FDaten);
  781.     if (PWurzelNode.FLinks <> nil) and (PWurzelNode.FRechts <> nil) then
  782.     begin
  783.       Stack.Push(PBufferNode);
  784.       PBufferNode := PBufferNode.FLinks;
  785.       ergebnis.Add(PBufferNode.FDaten);
  786.     end;
  787.     if Stack.Count <> 0 then
  788.     begin
  789.       repeat
  790.       begin
  791.         if ((PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil)) then
  792.         begin
  793.           if Stack.Peek <> PBufferNode then
  794.           begin
  795.             Stack.Push(PBufferNode);
  796.           end;
  797.           PBufferNode := PBufferNode.FLinks;
  798.         end
  799.         else if PBufferNode.FRechts <> nil then
  800.         begin
  801.           PBufferNode := PBufferNode.FRechts;
  802.         end
  803.         else if PBufferNode.FLinks <> nil then
  804.         begin
  805.           PBufferNode := PBufferNode.FLinks;
  806.         end
  807.         else
  808.         begin
  809.           PBufferNode := Stack.Peek;
  810.           Stack.Extract;
  811.           Stack.TrimExcess;
  812.           PBufferNode := PBufferNode.FRechts;
  813.           if (PBufferNode.FLinks <> nil) and (PBufferNode.FRechts <> nil) then
  814.           begin
  815.             Stack.Push(PBufferNode);
  816.           end;
  817.         end;
  818.         ergebnis.Add(PBufferNode.FDaten);
  819.       end;
  820.       until Stack.Count = 0;
  821.     end;
  822.       Stack.Clear;
  823.       Stack.Free;
  824.     end
  825.     else
  826.     begin
  827.       eingegeben := False;
  828.     end;
  829.     result := ergebnis;
  830. end;
  831.  
  832. function TForm4.Durchgelaufen;
  833. begin
  834.   result := eingegeben;
  835. end;
  836.  
  837. procedure TForm4.SetErgebnis;
  838. var
  839.   i: Integer;
  840. begin
  841.   i := 0;
  842.   while i < daten.Count do
  843.   begin
  844.     Einfuegen(daten[i]);
  845.     Inc(i);
  846.   end;
  847. end;
  848. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement