unit u_profiledetail; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids, fpjson, u_norms, u_chart; type { TProfileDetailForm } TProfileDetailForm = class(TForm) btnClose: TButton; PageControl1: TPageControl; TabSE: TTabSheet; TabFE: TTabSheet; TabStats: TTabSheet; TabItems: TTabSheet; rgNorm: TRadioGroup; lblName: TLabel; sgSE: TStringGrid; sgFE: TStringGrid; sgItems: TStringGrid; lblCorrelation: TLabel; lblAgreement: TLabel; memInterpretation: TMemo; chartSE: TProfileChart; chartFE: TProfileChart; chartStats: TProfileChart; procedure FormCreate(Sender: TObject); procedure rgNormClick(Sender: TObject); private FProfileData: TJSONObject; FSeItems: array[1..36] of Integer; FFeItems: array[1..36] of Integer; FSeSums: array[1..6] of Integer; FFeSums: array[1..6] of Integer; FSeValues: array[1..6] of Integer; FFeValues: array[1..6] of Integer; procedure LoadData; procedure CalculateSums; procedure CalculateProfileValues(const NormSE, NormFE: TNormValues); procedure UpdateTables; procedure UpdateCharts; procedure UpdateStatistics; procedure UpdateItemsTable; function CalculateCorrelation: Double; function CalculateAgreement: Double; function GetBewertung(Value: Integer): string; public constructor Create(AOwner: TComponent; ProfileData: TJSONObject); end; implementation {$R *.lfm} { TProfileDetailForm } constructor TProfileDetailForm.Create(AOwner: TComponent; ProfileData: TJSONObject); begin inherited Create(AOwner); FProfileData := ProfileData; Caption := 'Profil: ' + ProfileData.Get('name', 'Unbekannt'); Width := 1000; Height := 750; Position := poScreenCenter; FormCreate(Self); end; procedure TProfileDetailForm.FormCreate(Sender: TObject); var i: Integer; begin sgSE.ColCount := 6; sgSE.RowCount := 7; sgSE.FixedCols := 1; sgSE.FixedRows := 1; sgSE.Cells[0, 0] := 'Kompetenz'; for i := 1 to 5 do sgSE.Cells[i, 0] := IntToStr(i); sgSE.Cells[0, 1] := 'Arbeitsverhalten'; sgSE.Cells[0, 2] := 'Lernverhalten'; sgSE.Cells[0, 3] := 'Sozialverhalten'; sgSE.Cells[0, 4] := 'Fachkompetenz'; sgSE.Cells[0, 5] := 'Personale Kompetenz'; sgSE.Cells[0, 6] := 'Methodenkompetenz'; sgSE.DefaultRowHeight := 25; sgFE.ColCount := 6; sgFE.RowCount := 7; sgFE.FixedCols := 1; sgFE.FixedRows := 1; sgFE.Cells[0, 0] := 'Kompetenz'; for i := 1 to 5 do sgFE.Cells[i, 0] := IntToStr(i); for i := 1 to 6 do sgFE.Cells[0, i] := sgSE.Cells[0, i]; sgFE.DefaultRowHeight := 25; sgItems.ColCount := 3; sgItems.RowCount := 37; sgItems.FixedCols := 1; sgItems.FixedRows := 1; sgItems.Cells[0, 0] := 'Item'; sgItems.Cells[1, 0] := 'SE'; sgItems.Cells[2, 0] := 'FE'; for i := 1 to 36 do sgItems.Cells[0, i] := ITEMS[i]; sgItems.ColWidths[0] := 250; sgItems.ColWidths[1] := 50; sgItems.ColWidths[2] := 50; rgNorm.Items.Clear; rgNorm.Items.Add('Hauptschule (HS)'); rgNorm.Items.Add('Förderschule (FS)'); rgNorm.ItemIndex := 0; LoadData; end; procedure TProfileDetailForm.LoadData; var i: Integer; begin for i := 1 to 36 do FSeItems[i] := FProfileData.Get('item' + IntToStr(i), 2); for i := 1 to 36 do FFeItems[i] := FProfileData.Get('feitem' + IntToStr(i), 2); lblName.Caption := 'Name: ' + FProfileData.Get('name', ''); CalculateSums; if rgNorm.ItemIndex = 0 then CalculateProfileValues(NORM_SE_HS, NORM_FE_HS) else CalculateProfileValues(NORM_SE_FS, NORM_FE_FS); UpdateTables; UpdateCharts; UpdateStatistics; UpdateItemsTable; end; procedure TProfileDetailForm.CalculateSums; var i: Integer; begin FSeSums[1] := 0; FFeSums[1] := 0; for i := 1 to 10 do begin FSeSums[1] := FSeSums[1] + FSeItems[i]; FFeSums[1] := FFeSums[1] + FFeItems[i]; end; FSeSums[2] := 0; FFeSums[2] := 0; for i := 11 to 20 do begin FSeSums[2] := FSeSums[2] + FSeItems[i]; FFeSums[2] := FFeSums[2] + FFeItems[i]; end; FSeSums[3] := 0; FFeSums[3] := 0; for i := 21 to 28 do begin FSeSums[3] := FSeSums[3] + FSeItems[i]; FFeSums[3] := FFeSums[3] + FFeItems[i]; end; FSeSums[3] := FSeSums[3] + FSeItems[9] + FSeItems[10]; FFeSums[3] := FFeSums[3] + FFeItems[9] + FFeItems[10]; FSeSums[4] := 0; FFeSums[4] := 0; for i := 29 to 36 do begin FSeSums[4] := FSeSums[4] + FSeItems[i]; FFeSums[4] := FFeSums[4] + FFeItems[i]; end; FSeSums[5] := FSeItems[1] + FSeItems[2] + FSeItems[6] + FSeItems[7] + FSeItems[8] + FSeItems[9] + FSeItems[10] + FSeItems[12] + FSeItems[13] + FSeItems[14] + FSeItems[15]; FFeSums[5] := FFeItems[1] + FFeItems[2] + FFeItems[6] + FFeItems[7] + FFeItems[8] + FFeItems[9] + FFeItems[10] + FFeItems[12] + FFeItems[13] + FFeItems[14] + FFeItems[15]; FSeSums[6] := FSeItems[3] + FSeItems[4] + FSeItems[5] + FSeItems[9] + FSeItems[10] + FSeItems[11] + FSeItems[17] + FSeItems[18]; FFeSums[6] := FFeItems[3] + FFeItems[4] + FFeItems[5] + FFeItems[9] + FFeItems[10] + FFeItems[11] + FFeItems[17] + FFeItems[18]; end; procedure TProfileDetailForm.CalculateProfileValues(const NormSE, NormFE: TNormValues); var k, p: Integer; begin for k := 1 to 6 do begin FSeValues[k] := 4; for p := 1 to 5 do if FSeSums[k] < NormSE[k, p] then begin FSeValues[k] := p - 1; Break; end; FFeValues[k] := 4; for p := 1 to 5 do if FFeSums[k] < NormFE[k, p] then begin FFeValues[k] := p - 1; Break; end; end; end; procedure TProfileDetailForm.UpdateTables; var i, j: Integer; begin for i := 1 to 6 do for j := 1 to 5 do if j - 1 = FSeValues[i] then sgSE.Cells[j, i] := 'X' else sgSE.Cells[j, i] := ''; for i := 1 to 6 do for j := 1 to 5 do if j - 1 = FFeValues[i] then sgFE.Cells[j, i] := 'X' else sgFE.Cells[j, i] := ''; end; procedure TProfileDetailForm.UpdateCharts; var seChartValues: array[1..6] of Double; feChartValues: array[1..6] of Double; i: Integer; begin for i := 1 to 6 do begin seChartValues[i] := FSeValues[i] + 1; feChartValues[i] := FFeValues[i] + 1; end; chartSE.SetSeValues(seChartValues[1], seChartValues[2], seChartValues[3], seChartValues[4], seChartValues[5], seChartValues[6]); chartSE.SetFEValues(0, 0, 0, 0, 0, 0); chartFE.SetFEValues(feChartValues[1], feChartValues[2], feChartValues[3], feChartValues[4], feChartValues[5], feChartValues[6]); chartFE.SetSeValues(0, 0, 0, 0, 0, 0); chartStats.SetSeValues(seChartValues[1], seChartValues[2], seChartValues[3], seChartValues[4], seChartValues[5], seChartValues[6]); chartStats.SetFEValues(feChartValues[1], feChartValues[2], feChartValues[3], feChartValues[4], feChartValues[5], feChartValues[6]); end; procedure TProfileDetailForm.UpdateStatistics; var corr: Double; agree: Double; i: Integer; seVals: array[1..6] of Integer; feVals: array[1..6] of Integer; begin for i := 1 to 6 do begin seVals[i] := FSeValues[i] + 1; feVals[i] := FFeValues[i] + 1; end; corr := CalculateCorrelation; agree := CalculateAgreement; lblCorrelation.Caption := Format('Korrelation: %.2f', [corr]); lblAgreement.Caption := Format('Übereinstimmung: %.1f%%', [agree]); memInterpretation.Clear; memInterpretation.Lines.Add('Die Korrelation von ' + Format('%.2f', [corr]) + ' bedeutet:'); if corr >= 0.8 then memInterpretation.Lines.Add(' Sehr gute Übereinstimmung zwischen Selbst- und Fremdeinschätzung.') else if corr >= 0.5 then memInterpretation.Lines.Add(' Mäßige Übereinstimmung zwischen Selbst- und Fremdeinschätzung.') else if corr >= 0.3 then memInterpretation.Lines.Add(' Schwache Übereinstimmung zwischen Selbst- und Fremdeinschätzung.') else memInterpretation.Lines.Add(' Keine signifikante Übereinstimmung zwischen Selbst- und Fremdeinschätzung.'); memInterpretation.Lines.Add(''); memInterpretation.Lines.Add('Auswertung der Kompetenzen:'); memInterpretation.Lines.Add(StringOfChar('-', 50)); memInterpretation.Lines.Add('Selbsteinschätzung:'); for i := 1 to 6 do memInterpretation.Lines.Add(Format(' • %s: %s', [KOMPETENZEN[i], GetBewertung(seVals[i])])); memInterpretation.Lines.Add(''); memInterpretation.Lines.Add('Fremdeinschätzung:'); for i := 1 to 6 do memInterpretation.Lines.Add(Format(' • %s: %s', [KOMPETENZEN[i], GetBewertung(feVals[i])])); end; procedure TProfileDetailForm.UpdateItemsTable; var i: Integer; begin for i := 1 to 36 do begin sgItems.Cells[1, i] := IntToStr(FSeItems[i]); sgItems.Cells[2, i] := IntToStr(FFeItems[i]); end; end; function TProfileDetailForm.CalculateCorrelation: Double; var i: Integer; seMean, feMean: Double; seVals: array[1..6] of Double; feVals: array[1..6] of Double; numerator, seVar, feVar: Double; begin for i := 1 to 6 do begin seVals[i] := FSeValues[i] + 1; feVals[i] := FFeValues[i] + 1; end; seMean := (seVals[1] + seVals[2] + seVals[3] + seVals[4] + seVals[5] + seVals[6]) / 6; feMean := (feVals[1] + feVals[2] + feVals[3] + feVals[4] + feVals[5] + feVals[6]) / 6; numerator := 0; seVar := 0; feVar := 0; for i := 1 to 6 do begin numerator := numerator + (seVals[i] - seMean) * (feVals[i] - feMean); seVar := seVar + Sqr(seVals[i] - seMean); feVar := feVar + Sqr(feVals[i] - feMean); end; if (seVar = 0) or (feVar = 0) then Result := 0 else Result := numerator / Sqrt(seVar * feVar); end; function TProfileDetailForm.CalculateAgreement: Double; var i, matches: Integer; begin matches := 0; for i := 1 to 36 do if FSeItems[i] = FFeItems[i] then Inc(matches); Result := matches * 100 / 36; end; function TProfileDetailForm.GetBewertung(Value: Integer): string; begin case Value of 1: Result := 'weit unterdurchschnittlich'; 2: Result := 'unterdurchschnittlich'; 3: Result := 'durchschnittlich'; 4: Result := 'überdurchschnittlich'; 5: Result := 'weit überdurchschnittlich'; else Result := 'unbekannt'; end; end; procedure TProfileDetailForm.rgNormClick(Sender: TObject); begin if rgNorm.ItemIndex = 0 then CalculateProfileValues(NORM_SE_HS, NORM_FE_HS) else CalculateProfileValues(NORM_SE_FS, NORM_FE_FS); UpdateTables; UpdateCharts; UpdateStatistics; end; end.